{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "a239913a-b27f-15e7-8911-53b62bf41c4e"
   },
   "source": [
    "# Credit card fraud detection\n",
    "\n",
    "#### This notebook will test different methods on skewed data. The idea is to compare if preprocessing techniques work better when there is an overwhelming majority class that can disrupt the efficiency of our predictive model.\n",
    "\n",
    "#### You will also be able to see how to apply cross validation for hyperparameter tuning on different classification models. My intention is to create models using:\n",
    "1. Logistic Regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-03T16:05:43.790796Z",
     "start_time": "2018-11-03T16:05:43.778100Z"
    },
    "_cell_guid": "029ecde6-086d-7a8e-de44-363a7a23dbd8"
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from __future__ import division\n",
    "import numpy as np\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "b4de5f93-d467-ad7d-4597-03d5f3e89f86"
   },
   "source": [
    "# Loading the dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-03T15:54:12.238585Z",
     "start_time": "2018-11-03T15:54:04.176102Z"
    },
    "_cell_guid": "7e5ca1e3-3597-19d2-b4be-dffd335df630"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Time</th>\n",
       "      <th>V1</th>\n",
       "      <th>V2</th>\n",
       "      <th>V3</th>\n",
       "      <th>V4</th>\n",
       "      <th>V5</th>\n",
       "      <th>V6</th>\n",
       "      <th>V7</th>\n",
       "      <th>V8</th>\n",
       "      <th>V9</th>\n",
       "      <th>...</th>\n",
       "      <th>V21</th>\n",
       "      <th>V22</th>\n",
       "      <th>V23</th>\n",
       "      <th>V24</th>\n",
       "      <th>V25</th>\n",
       "      <th>V26</th>\n",
       "      <th>V27</th>\n",
       "      <th>V28</th>\n",
       "      <th>Amount</th>\n",
       "      <th>Class</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.0</td>\n",
       "      <td>-1.359807</td>\n",
       "      <td>-0.072781</td>\n",
       "      <td>2.536347</td>\n",
       "      <td>1.378155</td>\n",
       "      <td>-0.338321</td>\n",
       "      <td>0.462388</td>\n",
       "      <td>0.239599</td>\n",
       "      <td>0.098698</td>\n",
       "      <td>0.363787</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.018307</td>\n",
       "      <td>0.277838</td>\n",
       "      <td>-0.110474</td>\n",
       "      <td>0.066928</td>\n",
       "      <td>0.128539</td>\n",
       "      <td>-0.189115</td>\n",
       "      <td>0.133558</td>\n",
       "      <td>-0.021053</td>\n",
       "      <td>149.62</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.0</td>\n",
       "      <td>1.191857</td>\n",
       "      <td>0.266151</td>\n",
       "      <td>0.166480</td>\n",
       "      <td>0.448154</td>\n",
       "      <td>0.060018</td>\n",
       "      <td>-0.082361</td>\n",
       "      <td>-0.078803</td>\n",
       "      <td>0.085102</td>\n",
       "      <td>-0.255425</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.225775</td>\n",
       "      <td>-0.638672</td>\n",
       "      <td>0.101288</td>\n",
       "      <td>-0.339846</td>\n",
       "      <td>0.167170</td>\n",
       "      <td>0.125895</td>\n",
       "      <td>-0.008983</td>\n",
       "      <td>0.014724</td>\n",
       "      <td>2.69</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>-1.358354</td>\n",
       "      <td>-1.340163</td>\n",
       "      <td>1.773209</td>\n",
       "      <td>0.379780</td>\n",
       "      <td>-0.503198</td>\n",
       "      <td>1.800499</td>\n",
       "      <td>0.791461</td>\n",
       "      <td>0.247676</td>\n",
       "      <td>-1.514654</td>\n",
       "      <td>...</td>\n",
       "      <td>0.247998</td>\n",
       "      <td>0.771679</td>\n",
       "      <td>0.909412</td>\n",
       "      <td>-0.689281</td>\n",
       "      <td>-0.327642</td>\n",
       "      <td>-0.139097</td>\n",
       "      <td>-0.055353</td>\n",
       "      <td>-0.059752</td>\n",
       "      <td>378.66</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.966272</td>\n",
       "      <td>-0.185226</td>\n",
       "      <td>1.792993</td>\n",
       "      <td>-0.863291</td>\n",
       "      <td>-0.010309</td>\n",
       "      <td>1.247203</td>\n",
       "      <td>0.237609</td>\n",
       "      <td>0.377436</td>\n",
       "      <td>-1.387024</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.108300</td>\n",
       "      <td>0.005274</td>\n",
       "      <td>-0.190321</td>\n",
       "      <td>-1.175575</td>\n",
       "      <td>0.647376</td>\n",
       "      <td>-0.221929</td>\n",
       "      <td>0.062723</td>\n",
       "      <td>0.061458</td>\n",
       "      <td>123.50</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2.0</td>\n",
       "      <td>-1.158233</td>\n",
       "      <td>0.877737</td>\n",
       "      <td>1.548718</td>\n",
       "      <td>0.403034</td>\n",
       "      <td>-0.407193</td>\n",
       "      <td>0.095921</td>\n",
       "      <td>0.592941</td>\n",
       "      <td>-0.270533</td>\n",
       "      <td>0.817739</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.009431</td>\n",
       "      <td>0.798278</td>\n",
       "      <td>-0.137458</td>\n",
       "      <td>0.141267</td>\n",
       "      <td>-0.206010</td>\n",
       "      <td>0.502292</td>\n",
       "      <td>0.219422</td>\n",
       "      <td>0.215153</td>\n",
       "      <td>69.99</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 31 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   Time        V1        V2        V3        V4        V5        V6        V7  \\\n",
       "0   0.0 -1.359807 -0.072781  2.536347  1.378155 -0.338321  0.462388  0.239599   \n",
       "1   0.0  1.191857  0.266151  0.166480  0.448154  0.060018 -0.082361 -0.078803   \n",
       "2   1.0 -1.358354 -1.340163  1.773209  0.379780 -0.503198  1.800499  0.791461   \n",
       "3   1.0 -0.966272 -0.185226  1.792993 -0.863291 -0.010309  1.247203  0.237609   \n",
       "4   2.0 -1.158233  0.877737  1.548718  0.403034 -0.407193  0.095921  0.592941   \n",
       "\n",
       "         V8        V9  ...         V21       V22       V23       V24  \\\n",
       "0  0.098698  0.363787  ...   -0.018307  0.277838 -0.110474  0.066928   \n",
       "1  0.085102 -0.255425  ...   -0.225775 -0.638672  0.101288 -0.339846   \n",
       "2  0.247676 -1.514654  ...    0.247998  0.771679  0.909412 -0.689281   \n",
       "3  0.377436 -1.387024  ...   -0.108300  0.005274 -0.190321 -1.175575   \n",
       "4 -0.270533  0.817739  ...   -0.009431  0.798278 -0.137458  0.141267   \n",
       "\n",
       "        V25       V26       V27       V28  Amount  Class  \n",
       "0  0.128539 -0.189115  0.133558 -0.021053  149.62      0  \n",
       "1  0.167170  0.125895 -0.008983  0.014724    2.69      0  \n",
       "2 -0.327642 -0.139097 -0.055353 -0.059752  378.66      0  \n",
       "3  0.647376 -0.221929  0.062723  0.061458  123.50      0  \n",
       "4 -0.206010  0.502292  0.219422  0.215153   69.99      0  \n",
       "\n",
       "[5 rows x 31 columns]"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.read_csv(\"https://s3-us-west-1.amazonaws.com/blackhat-us-2017/creditcard.csv\")\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "6268bbd8-6de5-2389-5693-ecd9a14872d4"
   },
   "source": [
    "# Checking the target classes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-03T15:54:12.472790Z",
     "start_time": "2018-11-03T15:54:12.243294Z"
    },
    "_cell_guid": "3f6e6674-12e9-6983-5788-5755f80c7ec2"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0,0.5,'Frequency')"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "count_classes = pd.value_counts(data['Class'], sort = True).sort_index()\n",
    "count_classes.plot(kind = 'bar')\n",
    "plt.title(\"Fraud class histogram\")\n",
    "plt.xlabel(\"Class\")\n",
    "plt.ylabel(\"Frequency\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "801dd843-a90b-bb5f-97e7-2da84cc6cd6a"
   },
   "source": [
    "### Clearly the data is totally unbalanced!! \n",
    "\n",
    "#### This is a clear example where using a typical accuracy score to evaluate our classification algorithm. For example, if we just used a majority class to assign values to all records, we will still be having a high accuracy, BUT WE WOULD BE CLASSIFYING ALL \"1\" INCORRECTLY!!\n",
    "\n",
    "#### There are several ways to approach this classification problem taking into consideration this unbalance. \n",
    "\n",
    "- Collect more data? Nice strategy but not applicable in this case\n",
    "- Changing the performance metric:\n",
    "    - Use the confusio nmatrix to calculate Precision, Recall\n",
    "    - F1score (weighted average of precision recall)\n",
    "    - Use Kappa - which is a classification accuracy normalized by the imbalance of the classes in the data\n",
    "    - ROC curves - calculates sensitivity/specificity ratio.\n",
    "- Resampling the dataset\n",
    "    - Essentially this is a method that will process the data to have an approximate 50-50 ratio.\n",
    "    - One way to achieve this is by OVER-sampling, which is adding copies of the under-represented class (better when you have little data)\n",
    "    - Another is UNDER-sampling, which deletes instances from the over-represented class (better when he have lot's of data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "555427ea-a862-c64f-9d88-ddbb4f0366a3"
   },
   "source": [
    "# Approach\n",
    "\n",
    "1. We are not going to perform feature engineering in first instance. The dataset has been downgraded in order to contain 30 features (28 anonamised + time + amount). \n",
    "2. We will then compare what happens when using resampling and when not using it. We will test this approach using a simple logistic regression classifier.\n",
    "3. We will evaluate the models by using some of the performance metrics mentioned above.\n",
    "4. We will repeat the best resampling/not resampling method, by tuning the parameters in the logistic regression classifier.\n",
    "5. We will finally perform classifications model using other classification algorithms."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "fb559c9d-f4fe-5c63-7bdb-14cd3529f660"
   },
   "source": [
    "# Setting our input and target variables + resampling.\n",
    "\n",
    "#### 1. Normalising the amount column. The amount column is not in line with the anonimised features."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-03T15:54:12.702181Z",
     "start_time": "2018-11-03T15:54:12.475453Z"
    },
    "_cell_guid": "3fd30a6f-c0ad-5ece-943c-651cdf14d0d6"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>V1</th>\n",
       "      <th>V2</th>\n",
       "      <th>V3</th>\n",
       "      <th>V4</th>\n",
       "      <th>V5</th>\n",
       "      <th>V6</th>\n",
       "      <th>V7</th>\n",
       "      <th>V8</th>\n",
       "      <th>V9</th>\n",
       "      <th>V10</th>\n",
       "      <th>...</th>\n",
       "      <th>V21</th>\n",
       "      <th>V22</th>\n",
       "      <th>V23</th>\n",
       "      <th>V24</th>\n",
       "      <th>V25</th>\n",
       "      <th>V26</th>\n",
       "      <th>V27</th>\n",
       "      <th>V28</th>\n",
       "      <th>Class</th>\n",
       "      <th>normAmount</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-1.359807</td>\n",
       "      <td>-0.072781</td>\n",
       "      <td>2.536347</td>\n",
       "      <td>1.378155</td>\n",
       "      <td>-0.338321</td>\n",
       "      <td>0.462388</td>\n",
       "      <td>0.239599</td>\n",
       "      <td>0.098698</td>\n",
       "      <td>0.363787</td>\n",
       "      <td>0.090794</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.018307</td>\n",
       "      <td>0.277838</td>\n",
       "      <td>-0.110474</td>\n",
       "      <td>0.066928</td>\n",
       "      <td>0.128539</td>\n",
       "      <td>-0.189115</td>\n",
       "      <td>0.133558</td>\n",
       "      <td>-0.021053</td>\n",
       "      <td>0</td>\n",
       "      <td>0.244964</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.191857</td>\n",
       "      <td>0.266151</td>\n",
       "      <td>0.166480</td>\n",
       "      <td>0.448154</td>\n",
       "      <td>0.060018</td>\n",
       "      <td>-0.082361</td>\n",
       "      <td>-0.078803</td>\n",
       "      <td>0.085102</td>\n",
       "      <td>-0.255425</td>\n",
       "      <td>-0.166974</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.225775</td>\n",
       "      <td>-0.638672</td>\n",
       "      <td>0.101288</td>\n",
       "      <td>-0.339846</td>\n",
       "      <td>0.167170</td>\n",
       "      <td>0.125895</td>\n",
       "      <td>-0.008983</td>\n",
       "      <td>0.014724</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.342475</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-1.358354</td>\n",
       "      <td>-1.340163</td>\n",
       "      <td>1.773209</td>\n",
       "      <td>0.379780</td>\n",
       "      <td>-0.503198</td>\n",
       "      <td>1.800499</td>\n",
       "      <td>0.791461</td>\n",
       "      <td>0.247676</td>\n",
       "      <td>-1.514654</td>\n",
       "      <td>0.207643</td>\n",
       "      <td>...</td>\n",
       "      <td>0.247998</td>\n",
       "      <td>0.771679</td>\n",
       "      <td>0.909412</td>\n",
       "      <td>-0.689281</td>\n",
       "      <td>-0.327642</td>\n",
       "      <td>-0.139097</td>\n",
       "      <td>-0.055353</td>\n",
       "      <td>-0.059752</td>\n",
       "      <td>0</td>\n",
       "      <td>1.160686</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.966272</td>\n",
       "      <td>-0.185226</td>\n",
       "      <td>1.792993</td>\n",
       "      <td>-0.863291</td>\n",
       "      <td>-0.010309</td>\n",
       "      <td>1.247203</td>\n",
       "      <td>0.237609</td>\n",
       "      <td>0.377436</td>\n",
       "      <td>-1.387024</td>\n",
       "      <td>-0.054952</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.108300</td>\n",
       "      <td>0.005274</td>\n",
       "      <td>-0.190321</td>\n",
       "      <td>-1.175575</td>\n",
       "      <td>0.647376</td>\n",
       "      <td>-0.221929</td>\n",
       "      <td>0.062723</td>\n",
       "      <td>0.061458</td>\n",
       "      <td>0</td>\n",
       "      <td>0.140534</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-1.158233</td>\n",
       "      <td>0.877737</td>\n",
       "      <td>1.548718</td>\n",
       "      <td>0.403034</td>\n",
       "      <td>-0.407193</td>\n",
       "      <td>0.095921</td>\n",
       "      <td>0.592941</td>\n",
       "      <td>-0.270533</td>\n",
       "      <td>0.817739</td>\n",
       "      <td>0.753074</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.009431</td>\n",
       "      <td>0.798278</td>\n",
       "      <td>-0.137458</td>\n",
       "      <td>0.141267</td>\n",
       "      <td>-0.206010</td>\n",
       "      <td>0.502292</td>\n",
       "      <td>0.219422</td>\n",
       "      <td>0.215153</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.073403</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 30 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         V1        V2        V3        V4        V5        V6        V7  \\\n",
       "0 -1.359807 -0.072781  2.536347  1.378155 -0.338321  0.462388  0.239599   \n",
       "1  1.191857  0.266151  0.166480  0.448154  0.060018 -0.082361 -0.078803   \n",
       "2 -1.358354 -1.340163  1.773209  0.379780 -0.503198  1.800499  0.791461   \n",
       "3 -0.966272 -0.185226  1.792993 -0.863291 -0.010309  1.247203  0.237609   \n",
       "4 -1.158233  0.877737  1.548718  0.403034 -0.407193  0.095921  0.592941   \n",
       "\n",
       "         V8        V9       V10     ...           V21       V22       V23  \\\n",
       "0  0.098698  0.363787  0.090794     ...     -0.018307  0.277838 -0.110474   \n",
       "1  0.085102 -0.255425 -0.166974     ...     -0.225775 -0.638672  0.101288   \n",
       "2  0.247676 -1.514654  0.207643     ...      0.247998  0.771679  0.909412   \n",
       "3  0.377436 -1.387024 -0.054952     ...     -0.108300  0.005274 -0.190321   \n",
       "4 -0.270533  0.817739  0.753074     ...     -0.009431  0.798278 -0.137458   \n",
       "\n",
       "        V24       V25       V26       V27       V28  Class  normAmount  \n",
       "0  0.066928  0.128539 -0.189115  0.133558 -0.021053      0    0.244964  \n",
       "1 -0.339846  0.167170  0.125895 -0.008983  0.014724      0   -0.342475  \n",
       "2 -0.689281 -0.327642 -0.139097 -0.055353 -0.059752      0    1.160686  \n",
       "3 -1.175575  0.647376 -0.221929  0.062723  0.061458      0    0.140534  \n",
       "4  0.141267 -0.206010  0.502292  0.219422  0.215153      0   -0.073403  \n",
       "\n",
       "[5 rows x 30 columns]"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "data['normAmount'] = StandardScaler().fit_transform(data['Amount'].values.reshape(-1, 1))\n",
    "data = data.drop(['Time','Amount'],axis=1)\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "cfffc4c5-b621-250f-3b6b-6118cef52b9d"
   },
   "source": [
    "#### 2. Resampling.\n",
    "\n",
    "- As we mentioned earlier, there are several ways to resample skewed data. Apart from under and over sampling, there is a very popular approach called SMOTE (Synthetic Minority Over-Sampling Technique), which is a combination of oversampling and undersampling, but the oversampling approach is not by replicating minority class but constructing new minority class data instance via an algorithm.\n",
    "\n",
    "- In this notebook, we will use traditional UNDER-sampling.\n",
    "\n",
    "- The way we will under sample the dataset will be by creating a 50/50 ratio. This will be done by randomly selecting \"x\" amount of sample from the majority class, being \"x\" the total number of records with the minority class."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-03T15:54:06.954000Z",
     "start_time": "2018-11-03T15:54:06.927158Z"
    },
    "_cell_guid": "c1d874fa-5ea5-edbb-726c-ae98c84e6120"
   },
   "outputs": [],
   "source": [
    "X = data.iloc[:, data.columns != 'Class']\n",
    "y = data.iloc[:, data.columns == 'Class']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-03T15:54:27.473931Z",
     "start_time": "2018-11-03T15:54:27.402424Z"
    },
    "_cell_guid": "2af7c203-44ed-66b6-6141-ac0d0637fcc6"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('Percentage of normal transactions: ', 0.5)\n",
      "('Percentage of fraud transactions: ', 0.5)\n",
      "('Total number of transactions in resampled data: ', 984)\n"
     ]
    }
   ],
   "source": [
    "# Number of data points in the minority class\n",
    "number_records_fraud = len(data[data.Class == 1])\n",
    "fraud_indices = np.array(data[data.Class == 1].index)\n",
    "\n",
    "# Picking the indices of the normal classes\n",
    "normal_indices = data[data.Class == 0].index\n",
    "\n",
    "# Out of the indices we picked, randomly select \"x\" number (number_records_fraud)\n",
    "random_normal_indices = np.random.choice(normal_indices, number_records_fraud, replace = False)\n",
    "random_normal_indices = np.array(random_normal_indices)\n",
    "\n",
    "# Appending the 2 indices\n",
    "under_sample_indices = np.concatenate([fraud_indices,random_normal_indices])\n",
    "\n",
    "# Under sample dataset\n",
    "under_sample_data = data.iloc[under_sample_indices,:]\n",
    "\n",
    "X_undersample = under_sample_data.iloc[:, under_sample_data.columns != 'Class']\n",
    "y_undersample = under_sample_data.iloc[:, under_sample_data.columns == 'Class']\n",
    "\n",
    "# Showing ratio\n",
    "print(\"Percentage of normal transactions: \", len(under_sample_data[under_sample_data.Class == 0])/float(len(under_sample_data)))\n",
    "print(\"Percentage of fraud transactions: \", len(under_sample_data[under_sample_data.Class == 1])/float(len(under_sample_data)))\n",
    "print(\"Total number of transactions in resampled data: \", len(under_sample_data))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "6b74ba73-82a8-3585-b790-44fe486ff19d"
   },
   "source": [
    "# Splitting data into train and test set. Cross validation will be used when calculating accuracies."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-03T15:55:48.985351Z",
     "start_time": "2018-11-03T15:55:48.794082Z"
    },
    "_cell_guid": "4a725b16-c14a-2be8-8240-617b7b2ed8cd"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('Number transactions train dataset: ', 199364)\n",
      "('Number transactions test dataset: ', 85443)\n",
      "('Total number of transactions: ', 284807)\n",
      "\n",
      "('Number transactions train dataset: ', 688)\n",
      "('Number transactions test dataset: ', 296)\n",
      "('Total number of transactions: ', 984)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "# Whole dataset\n",
    "X_train, X_test, y_train, y_test = train_test_split(X,y,test_size = 0.3, random_state = 0)\n",
    "\n",
    "print(\"Number transactions train dataset: \", len(X_train))\n",
    "print(\"Number transactions test dataset: \", len(X_test))\n",
    "print(\"Total number of transactions: \", len(X_train)+len(X_test))\n",
    "\n",
    "# Undersampled dataset\n",
    "X_train_undersample, X_test_undersample, y_train_undersample, y_test_undersample = train_test_split(X_undersample\n",
    "                                                                                                   ,y_undersample\n",
    "                                                                                                   ,test_size = 0.3\n",
    "                                                                                                   ,random_state = 0)\n",
    "print(\"\")\n",
    "print(\"Number transactions train dataset: \", len(X_train_undersample))\n",
    "print(\"Number transactions test dataset: \", len(X_test_undersample))\n",
    "print(\"Total number of transactions: \", len(X_train_undersample)+len(X_test_undersample))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "6927cc69-57e6-4f34-4680-0b0016d414a0"
   },
   "source": [
    "# Logistic regression classifier - Undersampled data\n",
    "\n",
    "#### We are very interested in the recall score, because that is the metric that will help us try to capture the most fraudulent transactions. If you think how Accuracy, Precision and Recall work for a confusion matrix, recall would be the most interesting:\n",
    "\n",
    "- Accuracy = (TP+TN)/total\n",
    "- Precision = TP/(TP+FP)\n",
    "- Recall = TP/(TP+FN)\n",
    "\n",
    "#### As we know, due to the imbalacing of the data, many observations could be predicted as False Negatives, being, that we predict a normal transaction, but it is in fact a fraudulent one. Recall captures this.\n",
    "- Obviously, trying to increase recall, tends to come with a decrease of precision. However, in our case, if we predict that a transaction is fraudulent and turns out not to be, is not a massive problem compared to the opposite. \n",
    "- We could even apply a cost function when having FN and FP with different weights for each type of error, but let's leave that aside for now."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-04T00:35:02.476042Z",
     "start_time": "2018-11-04T00:35:02.469768Z"
    },
    "_cell_guid": "9c7ec815-da54-993b-ef8d-b41b767cfacf"
   },
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.model_selection import KFold, cross_val_score, GridSearchCV\n",
    "from sklearn.metrics import confusion_matrix,precision_recall_curve,auc,roc_auc_score,roc_curve,recall_score,classification_report "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "88765ef8-cb56-860a-d249-9691d90afcb2"
   },
   "source": [
    "#### Very ad-hoc function to print K_fold_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-04T00:39:59.403155Z",
     "start_time": "2018-11-04T00:39:58.965181Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "# Tuning hyper-parameters for recall\n",
      "()\n",
      "Best parameters set found on development set:\n",
      "\n",
      "{'C': 0.01}\n",
      "Grid scores on development set:\n",
      "0.916 (+/-0.056) for {'C': 0.01}\n",
      "0.907 (+/-0.068) for {'C': 0.1}\n",
      "0.916 (+/-0.089) for {'C': 1}\n",
      "0.916 (+/-0.089) for {'C': 10}\n",
      "0.913 (+/-0.095) for {'C': 100}\n",
      "Detailed classification report:\n",
      "The model is trained on the full development set.\n",
      "The scores are computed on the full evaluation set.\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       1.00      0.96      0.98     85296\n",
      "           1       0.04      0.93      0.08       147\n",
      "\n",
      "   micro avg       0.96      0.96      0.96     85443\n",
      "   macro avg       0.52      0.94      0.53     85443\n",
      "weighted avg       1.00      0.96      0.98     85443\n",
      "\n",
      "()\n"
     ]
    }
   ],
   "source": [
    "c_param_range = [0.01,0.1,1,10,100]\n",
    "\n",
    "print(\"# Tuning hyper-parameters for %s\" % score)\n",
    "print()\n",
    "\n",
    "clf = GridSearchCV(LogisticRegression(), {\"C\": c_param_range}, cv=5, scoring='recall')\n",
    "clf.fit(X_train_undersample,y_train_undersample)\n",
    "\n",
    "print \"Best parameters set found on development set:\"\n",
    "print\n",
    "print clf.best_params_\n",
    "\n",
    "print \"Grid scores on development set:\"\n",
    "means = clf.cv_results_['mean_test_score']\n",
    "stds = clf.cv_results_['std_test_score']\n",
    "for mean, std, params in zip(means, stds, clf.cv_results_['params']):\n",
    "    print(\"%0.3f (+/-%0.03f) for %r\"\n",
    "          % (mean, std * 2, params))\n",
    "\n",
    "print \"Detailed classification report:\"\n",
    "print \"The model is trained on the full development set.\"\n",
    "print \"The scores are computed on the full evaluation set.\"\n",
    "y_true, y_pred = y_test, clf.predict(X_test)\n",
    "print(classification_report(y_true, y_pred))\n",
    "print()\n",
    "\n",
    "# Note the problem is too easy: the hyperparameter plateau is too flat and the\n",
    "# output model is the same for precision and recall with ties in quality.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-04T00:42:39.453151Z",
     "start_time": "2018-11-04T00:42:39.440375Z"
    },
    "_cell_guid": "069bc837-cfd1-006e-c589-7085d5d29a8e"
   },
   "outputs": [],
   "source": [
    "# Find the best hyper-parameter optimizing for recall\n",
    "def print_gridsearch_scores(x_train_data,y_train_data):\n",
    "    c_param_range = [0.01,0.1,1,10,100]\n",
    "\n",
    "    clf = GridSearchCV(LogisticRegression(), {\"C\": c_param_range}, cv=5, scoring='recall')\n",
    "    clf.fit(x_train_data,y_train_data)\n",
    "\n",
    "    print \"Best parameters set found on development set:\"\n",
    "    print\n",
    "    print clf.best_params_\n",
    "\n",
    "    print \"Grid scores on development set:\"\n",
    "    means = clf.cv_results_['mean_test_score']\n",
    "    stds = clf.cv_results_['std_test_score']\n",
    "    for mean, std, params in zip(means, stds, clf.cv_results_['params']):\n",
    "        print \"%0.3f (+/-%0.03f) for %r\" % (mean, std * 2, params)\n",
    "        \n",
    "    return clf.best_params_[\"C\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-04T00:42:40.091983Z",
     "start_time": "2018-11-04T00:42:39.798627Z"
    },
    "_cell_guid": "983c1c75-8092-9a8e-40ca-754fde9e2301"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best parameters set found on development set:\n",
      "\n",
      "{'C': 0.01}\n",
      "Grid scores on development set:\n",
      "0.916 (+/-0.056) for {'C': 0.01}\n",
      "0.907 (+/-0.068) for {'C': 0.1}\n",
      "0.916 (+/-0.089) for {'C': 1}\n",
      "0.916 (+/-0.089) for {'C': 10}\n",
      "0.913 (+/-0.095) for {'C': 100}\n"
     ]
    }
   ],
   "source": [
    "best_c = print_gridsearch_scores(X_train_undersample,y_train_undersample)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "bdb1ff38-9d27-ae15-58df-9be4e4f76550"
   },
   "source": [
    "#### Create a function to plot a fancy confusion matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-04T00:42:40.727673Z",
     "start_time": "2018-11-04T00:42:40.707188Z"
    },
    "_cell_guid": "f5b049b3-4f9a-f5bb-db3d-6c48e9b1e1a5"
   },
   "outputs": [],
   "source": [
    "import itertools\n",
    "\n",
    "def plot_confusion_matrix(cm, classes,\n",
    "                          normalize=False,\n",
    "                          title='Confusion matrix',\n",
    "                          cmap=plt.cm.Blues):\n",
    "    \"\"\"\n",
    "    This function prints and plots the confusion matrix.\n",
    "    Normalization can be applied by setting `normalize=True`.\n",
    "    \"\"\"\n",
    "    plt.imshow(cm, interpolation='nearest', cmap=cmap)\n",
    "    plt.title(title)\n",
    "    plt.colorbar()\n",
    "    tick_marks = np.arange(len(classes))\n",
    "    plt.xticks(tick_marks, classes, rotation=0)\n",
    "    plt.yticks(tick_marks, classes)\n",
    "\n",
    "    if normalize:\n",
    "        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n",
    "        #print(\"Normalized confusion matrix\")\n",
    "    else:\n",
    "        1#print('Confusion matrix, without normalization')\n",
    "\n",
    "    #print(cm)\n",
    "\n",
    "    thresh = cm.max() / 2.\n",
    "    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n",
    "        plt.text(j, i, cm[i, j],\n",
    "                 horizontalalignment=\"center\",\n",
    "                 color=\"white\" if cm[i, j] > thresh else \"black\")\n",
    "\n",
    "    plt.tight_layout()\n",
    "    plt.ylabel('True label')\n",
    "    plt.xlabel('Predicted label')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "e40b554a-5b88-2828-f655-d54560ad7480"
   },
   "source": [
    "### Predictions on test set and plotting confusion matrix\n",
    "\n",
    "#### We have been talking about using the recall metric as our proxy of how effective our predictive model is. Even though recall is still the recall we want to calculate, just bear mind in mind that the undersampled data hasn't got a skewness towards a certain class, which doesn't make recall metric as critical. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-04T00:42:41.489547Z",
     "start_time": "2018-11-04T00:42:41.241496Z"
    },
    "_cell_guid": "5c8e4c0e-8cfd-7422-04a8-1b47b8531267"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('Recall metric in the testing dataset: ', 0.9251700680272109)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Use this C_parameter to build the final model with the whole training dataset and predict the classes in the test\n",
    "# dataset\n",
    "lr = LogisticRegression(C = best_c, penalty = 'l1')\n",
    "lr.fit(X_train_undersample,y_train_undersample.values.ravel())\n",
    "y_pred_undersample = lr.predict(X_test_undersample.values)\n",
    "\n",
    "# Compute confusion matrix\n",
    "cnf_matrix = confusion_matrix(y_test_undersample,y_pred_undersample)\n",
    "np.set_printoptions(precision=2)\n",
    "\n",
    "print(\"Recall metric in the testing dataset: \", cnf_matrix[1,1]/(cnf_matrix[1,0]+cnf_matrix[1,1]))\n",
    "\n",
    "# Plot non-normalized confusion matrix\n",
    "class_names = [0,1]\n",
    "plt.figure()\n",
    "plot_confusion_matrix(cnf_matrix\n",
    "                      , classes=class_names\n",
    "                      , title='Confusion matrix')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "3aee694e-c838-434a-0cb6-dafaa3a0b224"
   },
   "source": [
    "#### So, the model is offering an 92.5% recall accuracy on the generalised unseen data (test set). Not a bad percentage to be the first try. However, remember this is a 92.5% recall accuracy measure on the undersampled test set.\n",
    "\n",
    "### Being happy with this result, let's apply the model we fitted and test it on the whole data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-04T00:42:43.940100Z",
     "start_time": "2018-11-04T00:42:43.645024Z"
    },
    "_cell_guid": "2fac80a6-cc45-49e8-3fd6-2322e2461955"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('Recall metric in the testing dataset: ', 0.9183673469387755)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Use this C_parameter to build the final model with the whole training dataset and predict the classes in the test\n",
    "# dataset\n",
    "lr = LogisticRegression(C = best_c, penalty = 'l1')\n",
    "lr.fit(X_train_undersample,y_train_undersample.values.ravel())\n",
    "y_pred = lr.predict(X_test.values)\n",
    "\n",
    "# Compute confusion matrix\n",
    "cnf_matrix = confusion_matrix(y_test,y_pred)\n",
    "np.set_printoptions(precision=2)\n",
    "\n",
    "print(\"Recall metric in the testing dataset: \", cnf_matrix[1,1]/(cnf_matrix[1,0]+cnf_matrix[1,1]))\n",
    "\n",
    "# Plot non-normalized confusion matrix\n",
    "class_names = [0,1]\n",
    "plt.figure()\n",
    "plot_confusion_matrix(cnf_matrix\n",
    "                      , classes=class_names\n",
    "                      , title='Confusion matrix')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "e90966bc-2fb9-8442-4705-340d15a79b66"
   },
   "source": [
    "### Still a very decent recall accuracy when applying it to a much larger and skewed dataset! \n",
    "\n",
    "#### We can start to be happy with how initial approach is working."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "29bf4990-1b01-52fc-6c37-d4414b0aafa7"
   },
   "source": [
    "### Plotting ROC curve and Precision-Recall curve.\n",
    "\n",
    "- I find precision-recall curve much more convenient in this case as our problems relies on the \"positive\" class being more interesting than the negative class, but as we have calculated the recall precision, I am not going to plot the precision recall curves yet.\n",
    "\n",
    "- AUC and ROC curve are also interesting to check if the model is also predicting as a whole correctly and not making many errors"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-04T00:42:49.509973Z",
     "start_time": "2018-11-04T00:42:49.237919Z"
    },
    "_cell_guid": "4a0d3339-cb16-5899-0b0e-f86636284a63"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# ROC CURVE\n",
    "lr = LogisticRegression(C = best_c, penalty = 'l1')\n",
    "y_pred_undersample_score = lr.fit(X_train_undersample,y_train_undersample.values.ravel()).decision_function(X_test_undersample.values)\n",
    "\n",
    "fpr, tpr, thresholds = roc_curve(y_test_undersample.values.ravel(),y_pred_undersample_score)\n",
    "roc_auc = auc(fpr,tpr)\n",
    "\n",
    "# Plot ROC\n",
    "plt.title('Receiver Operating Characteristic')\n",
    "plt.plot(fpr, tpr, 'b',label='AUC = %0.2f'% roc_auc)\n",
    "plt.legend(loc='lower right')\n",
    "plt.plot([0,1],[0,1],'r--')\n",
    "plt.xlim([-0.1,1.0])\n",
    "plt.ylim([-0.1,1.01])\n",
    "plt.ylabel('True Positive Rate')\n",
    "plt.xlabel('False Positive Rate')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "1f1e40a4-bca8-87ad-f368-d0b50e7d6158"
   },
   "source": [
    "#### An additional comment that would be interesting to do is to initialise multiple undersampled datasets and repeat the process in loop. Remember that, to create an undersample data, we randomly got records from the majority class. Even though this is a valid technique, is doesn't represent the real population, so it would be interesting to repeat the process with different undersample configurations and check if the previous chosen parameters are still the most effective. In the end, the idea is to use a wider random representation of the whole dataset and rely on the averaged best parameters."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "2e0e6bfc-37ac-2d2e-61af-7118619fdf27"
   },
   "source": [
    "# Logistic regression classifier - Skewed data\n",
    "\n",
    "#### Having tested our previous approach, I find really interesting to test the same process on the skewed data. Our intuition is that skewness will introduce issues difficult to capture, and therefore, provide a less effective algorithm.\n",
    "- To be fair, taking into account the fact that the train and test datasets are substantially bigger than the undersampled ones, I believe a K-fold cross validation is necessary. I guess that by splitting the data with 60% in training set, 20% cross validation and 20% test should be enough... but let's take the same approach as before (no harm on this, it's just that K-fold is computationally more expensive)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-04T00:43:31.501891Z",
     "start_time": "2018-11-04T00:42:50.753355Z"
    },
    "_cell_guid": "2aaf245f-43cd-d543-b857-562fb696fc4e"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best parameters set found on development set:\n",
      "\n",
      "{'C': 10}\n",
      "Grid scores on development set:\n",
      "0.591 (+/-0.121) for {'C': 0.01}\n",
      "0.594 (+/-0.076) for {'C': 0.1}\n",
      "0.612 (+/-0.106) for {'C': 1}\n",
      "0.620 (+/-0.122) for {'C': 10}\n",
      "0.620 (+/-0.122) for {'C': 100}\n"
     ]
    }
   ],
   "source": [
    "best_c = print_gridsearch_scores(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-04T00:43:40.964169Z",
     "start_time": "2018-11-04T00:43:35.816138Z"
    },
    "_cell_guid": "634c1907-a5c5-888c-c2e9-da73f81ee445"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('Recall metric in the testing dataset: ', 0.6190476190476191)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Use this C_parameter to build the final model with the whole training dataset and predict the classes in the test\n",
    "# dataset\n",
    "lr = LogisticRegression(C = best_c, penalty = 'l1')\n",
    "lr.fit(X_train,y_train.values.ravel())\n",
    "y_pred_undersample = lr.predict(X_test.values)\n",
    "\n",
    "# Compute confusion matrix\n",
    "cnf_matrix = confusion_matrix(y_test,y_pred_undersample)\n",
    "np.set_printoptions(precision=2)\n",
    "\n",
    "print(\"Recall metric in the testing dataset: \", cnf_matrix[1,1]/(cnf_matrix[1,0]+cnf_matrix[1,1]))\n",
    "\n",
    "# Plot non-normalized confusion matrix\n",
    "class_names = [0,1]\n",
    "plt.figure()\n",
    "plot_confusion_matrix(cnf_matrix\n",
    "                      , classes=class_names\n",
    "                      , title='Confusion matrix')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "f409ba42-8534-e960-0869-00b1e4e73d65"
   },
   "source": [
    "# Before continuing... changing classification threshold.\n",
    "\n",
    "#### We have seen that by undersampling the data, our algorithm does a much better job at detecting fraud. I wanted also to show how can we tweak our final classification by changing the thresold.\n",
    "- Initially, you build the classification model and then you predict unseen data using it.\n",
    "- We previously used the \"predict()\" method to decided whether a record should belong to \"1\" or \"0\". \n",
    "- There is another method \"predict_proba()\".\n",
    "    - This method returns the probabilities for each class. The idea is that by changing the threshold to assign a record to class 1, we can control precision and recall.\n",
    "    \n",
    "#### Let's check this using the undersampled data (best C_param = 0.01)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-04T00:44:52.939827Z",
     "start_time": "2018-11-04T00:44:50.815289Z"
    },
    "_cell_guid": "a1275e7d-48fc-e0bd-c629-6ddf698b47b5"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Recall metric in the testing dataset for threshold 0.1: 1.0\n",
      "Recall metric in the testing dataset for threshold 0.2: 1.0\n",
      "Recall metric in the testing dataset for threshold 0.3: 1.0\n",
      "Recall metric in the testing dataset for threshold 0.4: 0.979591836735\n",
      "Recall metric in the testing dataset for threshold 0.5: 0.925170068027\n",
      "Recall metric in the testing dataset for threshold 0.6: 0.857142857143\n",
      "Recall metric in the testing dataset for threshold 0.7: 0.829931972789\n",
      "Recall metric in the testing dataset for threshold 0.8: 0.741496598639\n",
      "Recall metric in the testing dataset for threshold 0.9: 0.585034013605\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsgAAALICAYAAABiqwZ2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzs3Xm8HGWZ9vHfdbKwBgMEEBIgbILAyBYBx2VQFFBQHBeEQRZF0RkVdUZZZGRxeUVxBBxUJooGEFldAEURUQdxCBCCLGGRSFgSlhA2gYQl4X7/qDqh0jmnT/VJ9al+uq8vn/qku7pO1dOHXKm7qp56ShGBmZmZmZll+upugJmZmZlZJ3GBbGZmZmZW4ALZzMzMzKzABbKZmZmZWYELZDMzMzOzAhfIZmZmZmYFLpDNzMzMzApcIJuZmZmZFbhANjMzMzMrGF13A8w6yag1No5YvKjUsrHo0SsiYq82N8nMBuG8mqUlpcy6QDYriMXPsdJW+5da9rmb/ntCm5tjZk04r2ZpSSmzLpDNigRIdbfCzMpwXs3SklBmXSCbNZK75pslw3k1S0simXWBbNYokaNbM8N5NUtNIpl1gWy2DEHfqLobYWalOK9maUknsy6QzYpEMpd/zHqe82qWloQy6wLZbBlK5vKPmTmvZmlJJ7MukM0aJXJ0a2Y4r2apSSSzLpDNGiVydGtmOK9mqUkks2mU8WYjRtnRbZlpqDVJP5Q0X9JtA3z2H5JC0oT8vSR9W9JsSbdI2rENX86syzivZmlJJ7MukM2KRHaHbZlpaNOA5R6TKWlDYA/g/sLstwNb5NPhwPdW9KuYdT3n1SwtCWXWBbLZMqo7uo2Iq4HHB/joFOBIIArz9gXOjsx0YLyk9av4Rmbdy3k1S0s6mXUfZLNGfaX7R02QNKPwfmpETG32A5L2BeZFxM1ath/WROCBwvu5+byHyjbGrCc5r2ZpSSSzLpDNilobo3FBREwpvWppVeALZJd+zGxFOa9maUkosy6QzRq17w7bzYBNgP4j20nATEk7A/OADQvLTsrnmVkzzqtZWhLJrAtks2W07zGYEXErsO7SLUn3AlMiYoGkS4FPSjof2AV4KiJ8udasKefVLC3pZNY36QGSTpD04xHYzuR82JGWD0wk7SZpbpPPp0n6yoq10IAqh6A5D7gW2FLSXEmHNVn8cuAeYDbwfeDfqvgq3cqZtaWc147nvNoyEslsT5xBlvRM4e2qwPPAkvz9x0a+Rd1H0meBo8h+vxcD/xoRzw+w3FjgJ8AUYGPgzRHxxxFsanOq7jGYEXHAEJ9PLrwO4BOVbLgLOLPt10JmdwW+DOxE9v/gj8ARHXHG1HntCM5r+7WQ162Bs8m6GwDcSJbX20eqrU0llNmeOIMcEav3T2Tj4r2zMO/cVtY1nCPTukkaJ2mVNq5/T+BoYHeyondT4MQmP3IN8EHg4Xa1aYVUdHRrw+fMdlRm1wSmApPzZZ8GftSutrXMea2d89pReX0QeB+wFjABuBQ4v11tG5ZEMlt/CzrHWElnS3pa0ixJS++clHSvpKMk3QI8K2m0pA0k/VTSo5LmSDqisPzOkmZI+rukRyR9q2FbB0q6X9ICSccWfm4lSadKejCfTpW00kCNlbSDpJl5ey8AVm7y3bYFHpT0P/nZoKodApwZEbMi4gmys02HDrRgRLwQEadGxDW8fIahs/Qf4Q41Wd2c2eFrJbO/joiLIuLvEbEQOB14fRvaNDzOayqc1+FrJa9PRsS9+RlTke1nN29Dm4Yvkcy6QH7Zu8iOssaTHXGd3vD5AcDe+ecvAZcBN5ONo7c78Jn8KA/gNOC0iFiD7DLHhQ3regOwZf5zx0l6dT7/WGBXYHtgO2Bn4D8bG5p3U/gFcA7ZUeJFwHsH+2IRcS2wI9l4fz+RdIekI9UwSLakN0h6ssn0hkE2sU3+u+h3M7CepLUHa1Pnqm4Qc2s7Z7aezL4JmFViuRHgvCbEeR3BvEp6EngO+G/g/w223MhLJ7P1t6BzXBMRl0fEErJQbNfw+bcj4oGIWAS8FlgnIr6UnxG9h6zT9/75si8Cm0uaEBHP5E9tKToxIhZFxM1kf9H7t3Ug8KWImB8Rj5JdQjlogLbuCowBTo2IFyPiYuCGZl8uIuZExAlk/5h8HNgKuF3SLyVtlC9zTUSMbzJdM8jqVweeKrzvfz2uWZs6UrWPwbT2cmZHOLOSXgMcB3y+2XIjxnlNifM6gnmNiPHAK4BPAjc1a/uISiizLpBfVuwPuxBYWcv2hSo+gWVjYIPikR/Z4NTr5Z8fBrwKuFPSDZL2GWJbq+evNwDuK3x2Xz6v0QZkT4qJhmWHlP/M7WT/aMwlOzJdrczPNvEMsEbhff/rp1dwvTVI5+jWnNkV0HJmJW0O/Br4dET8aQW3XxHnNSHO6/ANax8bEc8CZwBnS1q32bIjJ53M1t+CdBSD8gAwp+HIb1xEvAMgIu6O7O7KdYGvAxdLKhOQB8n+Yei3UT6v0UPARGmZTjobNVtx3vfqfZIuA+4muyP9CGDTiLgjX+aNkp5pMr1xkNXPYtmzAdsBj0TEY83a1LES6R9lQ3JmK8qspI2B3wFfjohzmrV7xDmv3cJ5bc8+to9s5IuJJZYdGYlk1gXy8FwPPK3spoJVJI2StK2k1wJI+qCkdSLiJeDJ/GdeKrHe84D/lLSOpAlklzIHGjvyWmAxcISkMZLeQ9aXakD5ZdGHgE+T9avaMCIOjog/FI+QI+JPUbgbeYBpsLNGZwOHSdpa0niyPl3TmrRnJUn9NzyMlbRywz9E9Urk6NZa4swuq3RmJU0Efg+cHhFnNP911MB57UbO67JayevblN1gOErSGsC3gCeAO5r+ZkZSIpmtvwUJyvtQ7UPW0X8OsAD4AVl/H4C9gFnKxoY8Ddg/71c1lK8AM4BbgFuBmfm8xu2/ALyH7C7Wx4EPAD9rst75wM4R8caIODMiKu36EBG/Ab4B/IFsiJ/7gOP7P1d2x/KBhR+5C1hEdkR7Rf66eFRfr0SObq08Z3a59rSS2Y+QDSt1QvFsV5XtWSHOa9dxXpdrTyt5HU92IPAU8DeyPtF7RcRzVbZphSSSWS3bxcast/WtOTlWevMXSy373M8/cmNETBl6STNrB+fVLC0pZTa5AbnN2q2TenuYWXPOq1laUsmsC2SzApFOeM16nfNqlpaUMusC2axI+WRmnc95NUtLQpl1gWy2DCVzdGtmzqtZWtLJbEcVyBMmTIiNN55cdzOScdMd99fdhGTEC08TixeVSmVfnwd3KcN5bY3z2ppY9OiCiFhnqOWc13Kc19Y4r60pm1dIJ7MdVSBvvPFk/nzdjLqbkYw1X/vJupuQjOfvurD0sqkc3dbNeW2N89qa5/7ynVJPLnNey3FeW+O8tqZsXiGdzHZUgWxWu4T6R5n1POfVLC0JZdYFslmBEuofZdbrnFeztKSUWRfIZg1SCa+ZOa9mqUklsy6QzRqkEl4zc17NUpNKZl0gmxUJ1JdGeM16nvNqlpaEMpvGWBtmI0hSqanEen4oab6k2wrzTpZ0p6RbJP1c0vjCZ8dImi3pLkl7tunrmXUV59UsLalk1gWyWUH/DQRVhBeYBuzVMO9KYNuIeA3wV+AYAElbA/sD2+Q/811Jo6r6XmbdyHk1S0tKmXWBbNagqvBGxNXA4w3zfhsRi/O304FJ+et9gfMj4vmImAPMBnau7luZdSfn1SwtqWTWBbJZI5WcYIKkGYXp8Ba39GHg1/nricADhc/m5vPMrBnn1SwtiWTWN+mZFamlx2AuiIgpw9qMdCywGDh3OD9vZjivZqlJKLMukM0alOz7tCLrPxTYB9g9IiKfPQ/YsLDYpHyemTXhvJqlJZXMuouFWUHFNxAsv35pL+BI4F0RsbDw0aXA/pJWkrQJsAVw/Qp/IbMu5ryapSWlzPoMslmjig5uJZ0H7EbWj2oucDzZHbUrAVfm/wBMj4iPR8QsSRcCt5NdFvpERCyppiVmXcx5NUtLIpl1gWxWpOou/0TEAQPMPrPJ8l8FvlrJxs16gfNqlpaEMusC2axBu/tHmVl1nFeztKSSWRfIZg1SeQymmTmvZqlJJbMukM0apHJ0a2bOq1lqUsmsC2SzghW5e9bMRpbzapaWlDLrAtmsQSrhNTPn1Sw1qWTWBbJZg1TCa2bOq1lqUsmsC2SzBqncQGBmzqtZalLJrAtks6IKx2g0szZzXs3SklBmXSCbFQhIJLtmPc95NUtLSpl1gWy2jHTusDUz59UsLelk1gWyWYNEsmtmOK9mqUklsy6QzYoEfYncQGDW85xXs7QklFkXyGYFIp3wmvU659UsLSll1gWyWYNULv+YmfNqlppUMusC2axBKjcQmJnzapaaVDLbV3cDOtlvr/gNr9lmS7bZanNO/sZJdTenI5xx/IHcd9XXmHHRF5b77NMHvYVFN53O2uNXA2D8uFW44L8+yvUXHMOfzvkcW2+2/kg3t3XKjm7LTNZZnNeBdXVmndekObPL6+q8QlKZdYE8iCVLlvCZIz7BJZf9mptuuZ2Lzj+PO26/ve5m1e6cy6az7ye+s9z8SeuNZ/ddX839Dz2+dN6Rh+3JzXfNZecPfI3DvngO3/z8+0ayqcOSjdGoUpN1Dud1cN2cWec1Xc7swLo5r5BWZl0gD+KG669ns802Z5NNN2Xs2LG8/wP788vLLqm7WbX788y/8fhTC5eb/43PvZdjT/sFEbF03labvpL/veGvAPz13kfYeIO1WHetcSPW1uERfX3lJusczuvgujuzzmuqnNmBdXdeIaXMukAexIMPzmPSpA2Xvp84cRLz5s2rsUWda5/d/oEH5z/JrX9d9vdz61/nse9btgNgyjYbs9H6azFxvfF1NLElqRzd2suc19Z0U2ad1zQ5s+V1U14hncy2tUCWtJekuyTNlnR0O7dl9Vhl5TEc+eE9+dL3frXcZ9/80ZW8YtyqTD//aP51/3/i5rvmsmTJSzW0sgUJ9Y+qmvPaG7oqsz2cV3Bme0FX5RWSymzbRrGQNAr4DvA2YC5wg6RLIyKJTkYbbDCRuXMfWPp+3ry5TJw4scYWdaZNJ63DxhPX5voLjgFg4rrjufYnR/HGg07mkcee5mMn/Hjpsnf+6kTmzHusrqaW0t8/qpJ1ST8E9gHmR8S2+by1gAuAycC9wH4R8YSyjZ4GvANYCBwaETMraUi5tjqvPaKbMturec3b5sz2gG7KK6SV2XaeQd4ZmB0R90TEC8D5wL5t3F6lprz2tcyefTf3zpnDCy+8wEUXnM/e+7yr7mZ1nFmzH2Tj3Y9hq72PZ6u9j2fe/Cd53b98nUcee5pXrL4KY0aPAuBD//yPXDNzNk8/+1zNLR5ahUe304C9GuYdDVwVEVsAV+XvAd4ObJFPhwPfq+K7tMB57RHdltkezSs4sz2h2/IK6WS2neMgTwQeKLyfC+zSuJCkw8kay4YbbdTG5rRm9OjRnHLa6bxz7z1ZsmQJhxz6YbbeZpu6m1W7s752KG/caQsmjF+d2b/5Ml8+43LO+sW1Ay671aav5PtfOoiI4I6/PcTHTzx3hFs7PFXdHBARV0ua3DB7X2C3/PVZwB+Bo/L5Z0d2B8Z0SeMlrR8RD1XSmKE5r12q2zPbo3mFEpnt1LyCMzuYbs8rpJPZ2h8UEhFTgakAO+00JYZYfETt9fZ3sNfb31F3MzrKIcdMa/r5Vnsfv/T1dbfM4TXv/lKbW1QxtXT5Z4KkGYX3U/O/z82sVwjkw8B6+euBdnYTgZHc4Q7JeU1PV2fWeW2qk/MKzuxAujqvkFRm21kgzwM2LLyflM8z61hZ/6jSiy+IiCnD3VZEhKRO2Wk5r5acHs4rOLOWoJQy284+yDcAW0jaRNJYYH/g0jZuz6wC5YafWYGbDB6RtD5A/uf8fH7dOzvn1RLUs3kFZ9aSlE5m21YgR8Ri4JPAFcAdwIURMatd2zOrSpuHoLkUOCR/fQhwSWH+wcrsCjw1kv0ZnVdLVS/mFZxZS1cqmW1rH+SIuBy4vJ3bMKtahUPQnEd2s8AESXOB44GTgAslHQbcB+yXL3452fAzs8mGoPlQJY1ogfNqKerVvIIza2lKJbO136Rn1kmkSu+wPWCQj3YfYNkAPlHJhs16hPNqlpaUMusC2axBJzzi0szKcV7N0pJKZl0gmzVIJLtmhvNqlppUMusC2axBKke3Zua8mqUmlcy6QDYrWrG7Z81sJDmvZmlJKLMukM0KhCq7gcDM2st5NUtLSpl1gWzWoC+Vw1szc17NEpNKZl0gmzVIJLtmhvNqlppUMusC2awge4JPIuk163HOq1laUsrsoAWypDWa/WBE/L365pjVL5HuUctxZq0XOa9maUkls83OIM8CAih+lf73AWzUxnaZ1SaVo9sBOLPWc5xXs7SkktlBC+SI2HAkG2LWCUQ6NxA0cmat1zivZmlJKbN9ZRaStL+kL+SvJ0naqb3NMqtPn8pNncyZtV7hvJqlJZXMDlkgSzodeDNwUD5rIXBGOxtlVhsJlZw6lTNrPcN5NUtLQpktM4rFP0bEjpJuAoiIxyWNbXO7zGrTAblcUc6s9Qzn1SwtqWS2TIH8oqQ+spsGkLQ28FJbW2VWk5T6RzXhzFpPcF7N0pJSZssUyN8BfgqsI+lEYD/gxLa2yqxGqTwGswln1nqG82qWllQyO2SBHBFnS7oReGs+6/0RcVt7m2VWj2wQ87pbsWKcWesVzqtZWlLKbNkn6Y0CXiS7BFRq5AuzVKVy+WcIzqz1BOfVLC2pZLbMKBbHAucBGwCTgJ9IOqbdDTOri0pOncqZtV7ivJqlJZXMljmDfDCwQ0QsBJD0VeAm4GvtbJhZXTpheJkV5Mxaz3BezdKSSmbLXMp5iGUL6dH5PLOuI4lRfeWmEuv6rKRZkm6TdJ6klSVtIuk6SbMlXdCm4ZycWesJVeY1X18dmXVerWektI8dtECWdIqkbwGPA7Mk/UDS94FbgQXD3aBZp+u/iWCoqfk6NBE4ApgSEduS9THcH/g6cEpEbA48ARxWXbudWes9VeQ1W8/IZtZ5tV6Vyj62WReL/rtoZwG/KsyfPtyNmaWgwss/o4FVJL0IrEp2VugtwL/kn58FnAB8r6LtObPWcyq+XDuSmXVerSelso8dtECOiDOHs0KzlGWDmJdefIKkGYX3UyNiKkBEzJP0TeB+YBHwW+BG4MmIWJwvPxeYWEW78206s9ZTqsorjHxmnVfrRSntY4e8SU/SZsBXga2BlfvnR8SrhrtRs07WwtHtgoiYMsg61gT2BTYBngQuAvaqpIFDcGatl1SR13w9tWTWebVek8o+tsxNetOAH5EV/m8HLgQuqLIRZp2koiFo3grMiYhHI+JF4GfA64HxkvoPTCcB8ypuPjiz1kMqHDKqrsxOw3m1HpLKPrZMgbxqRFwBEBF/i4j/JAuxWdeRqOoO2/uBXSWtquxweXfgduAPwPvyZQ4BLmnD13BmrSdUmFeoL7POq/WMlPaxZcZBfl5SH/A3SR8nq8bHDXeDZp2uihsIIuI6SRcDM4HFZOOaTiW7Ged8SV/J57WjH6Izaz2jqht+asys82o9JZV9bJkC+bPAamTDaXwVeAXw4eFu0KzTVXWDbUQcDxzfMPseYOdqtjAoZ9Z6RpWDWNSUWefVekoq+9ghC+SIuC5/+TRwUBUbNetUQsk8J34wzqz1CufVLC0pZXbQAlnSz4EY7POIeE9bWmRWp5IPFehEzqz1HOfVLC0JZbbZGeTTR6wVNjyjyvSQMaClRI5KJb3Lc2Y7mfPaFs6rtYXz2japZLbZg0KuGsmGmHUCUfmTuUaMM2u9xnk1S0tKmfUhklmDFp7yY2Y1c17N0pJKZl0gmzVIJbxm5ryapSaVzJYukCWtFBHPt7MxZnWT0rn8MxRn1rqd82qWlpQyO+ST9CTtLOlW4O78/XaS/rvtLTOrSZ/KTZ3KmbVe4ryapSWVzJZ51PS3gX2AxwAi4mbgze1slFldRKWPrq2LM2s9wXk1S0tKmS3TxaIvIu5rOCW+pE3tMatdmaPGDufMWs9wXs3SkkpmyxTID0jaGQhJo4BPAX9tb7PM6pNI96hmnFnrGc6rWVpSyWyZAvlfyS4BbQQ8Avwun2fWdaR0HoPZhDNrPcF5NUtLSpkdskCOiPnA/iPQFrOOkEh2B+XMWi9xXs3SkkpmhyyQJX2fAZ4XHxGHt6VFZjUSMLoDbg5YEc6s9Qrn1SwtKWW2TBeL3xVerwz8M/BAe5pjVr9Ujm6bcGatZzivZmlJJbNlulhcUHwv6Rzgmra1yKxOHTL+4opwZq1nOK9maUkos8N51PQmwHpVN8SsU4hE0lueM2tdy3k1S0sqmS3TB/kJXu4f1Qc8DhzdzkaZ1UWkc3Q7GGfWeoXzapaWlDLbtEBWNnL5dsC8fNZLEbHczQRm3aQTnuAzXM6s9Rrn1SwtqWS26QNN8qBeHhFL8snBta7Wf3SbwnPiB+LMWi9xXs3SklJmyzzx7y+Sdmh7S8w6gbI7bMtMpVYnjZd0saQ7Jd0h6XWS1pJ0paS78z/XrPhbOLPWG5xXs7RUmNl253XQAllSf/eLHYAbJN0laaakmyTNHO4GzTpdX/6kn6Gmkk4DfhMRW5FdSr2DrH/hVRGxBXAVFfU3dGatFzmvZmmpMLNtzWuzPsjXAzsC7xruys1SU+UNBJJeAbwJOBQgIl4AXpC0L7BbvthZwB+BoyrYpDNrPcV5NUtLVZkdibw2K5CVb/Rvw1mxWapaGMR8gqQZhfdTI2Jq4f0mwKPAjyRtB9wIfBpYLyIeypd5mOqGdHJmrec4r2ZpqSizbc9rswJ5HUn/PtiHEfGt4W7UrFMJMap8ehdExJQmn48mO0P0qYi4TtJpNFzuiYiQVNWNOc6s9RTn1SwtFWa27XltViCPAlaHREZ0NqtCtXfPzgXmRsR1+fuLyQL8iKT1I+IhSesD8yvanjNrvcV5NUtLdZlte16bFcgPRcSXhrtis1S1cENPUxHxsKQHJG0ZEXcBuwO359MhwEn5n5dUskFn1nqQ82qWlioyOxJ5HbIPslkvES31jyrjU8C5ksYC9wAfIhs95kJJhwH3AftVtC1n1nqK82qWlooz29a8NiuQdx/uSs1SVtUZKYCI+AswUB+qduTLmbWe47yapaXCqz5tzeugBXJEPF7FBsxSImBUoud1nFnrNc6rWVpSymyzM8hmvUegiq/ZmlmbOK9maUkosy6QzRqkEV0zA+fVLDWpZNYFsllB9pSfVOJr1tucV7O0pJTZvrob0Ml+e8VveM02W7LNVptz8jdOqrs5HeGM4w7gvt9+mRkXLP/kxk8fuBuLZpzK2q9YDYDPHvRmpp/7eaaf+3lmXHAUz1z3LdZcY9WRbnLLVHKyzuK8DqzbM+u8psuZXV635xXSyawL5EEsWbKEzxzxCS657NfcdMvtXHT+edxx++11N6t251x2Hft+6n+Wmz9pvfHsvutW3P/Qy/ednHLOH9j1wJPZ9cCTOe70X/KnmbN54u8LR7K5wyKVm6xzOK+D6/bMOq9pcmYH1u15hXQy6wJ5EDdcfz2bbbY5m2y6KWPHjuX9H9ifX15W1fjw6frzTffw+AAB/Ma/v5tjv30pMchDHffbc0cuvGJmm1u34vofg1lmss7hvA6umzPrvKbLmR1YN+cV0sqsC+RBPPjgPCZN2nDp+4kTJzFv3rwaW9S59vmnbXlw/lPceveDA36+ykpjeNvrtuIXv79lhFs2PJJKTdY5nNfWdFNmndc0ObPldVNeIZ3Mtq1AlvRDSfMl3daubVj9VllpDEd+6G186YxfD7rM3m/almtvnpPEpR9Ip39U1ZzZ3tBtmXVenddu1m15hXQy284zyNOAvdq4/rbaYIOJzJ37wNL38+bNZeLEiTW2qDNtOmkCG2+wFtefdyR3XnocE9d9Bdee+znWW3vc0mXev8cOXJTApR9g6RiNKRzdtsE0Es2s81peV2XWeU0yr+DMltVVeYWkMtu2Yd4i4mpJk9u1/nab8trXMnv23dw7Zw4bTJzIRRecz7RzflJ3szrOrL89xMZ7fHHp+zsvPY7XH/RfPPbUswCssdrKvGHHzfjQF39cVxNbInq331HKmXVey+umzDqvmlx3O4bLmS2nm/IKaWW29nZKOlzSDEkzHl3waN3NWWr06NGcctrpvHPvPdn+H17Ne9+/H1tvs03dzardWV89mD/+6NO8auN1mf2rEzhk312aLv+uN7+Gq667i4XPvTBCLVxxfVKpqRc5r+np9sw6r4Pr1LyCMzuYbs8rpJNZxWC3RFax8uzo9pcRsW2Z5XfaaUr8+boZbWtPt1lz18/U3YRkPH/Hebz07CNDJm7zbbaL/zr/ilLrfPdr1r8xIqascOM6SCuZdV5b47y25rkbTxsyX86rJuO8toXz2poyeYW0Musn6ZkVZJd/6j9yNbOhOa9maUkpsy6QzRp0wJUdMyvJeTVLSyqZbecwb+cB1wJbSpor6bB2bcusOir9X7dxZi09zivOqyUlncy2cxSLA9q1brN2EXTEE3zq4MxaapxXs7SklFl3sTAr6pBnwJtZCc6rWVoSyqwLZLMGqYTXzJxXs9SkklkXyGYNOqHvk5mV47yapSWVzNb+oBCzTiKgT+WmUuuTRkm6SdIv8/ebSLpO0mxJF0ga28avY9bVqs4rOLNm7ZTSPtYFslmDiu+w/TRwR+H914FTImJz4AnAd56brYA23BHvzJq1USr7WBfIZg2qegympEnA3sAP8vcC3gJcnC9yFvDuNn0Ns55Q5WNrnVmz9ktlH+s+yGYF/Zd/Spogqfjs1qkRMbXw/lTgSGBc/n5t4MmIWJy/nwtMHH5rzXpbxXkFZ9asrVLax7pANltGS5d2Fgz2nHhJ+wDzI+JGSbtV1TozK6omr+DMmo2MdPaxLpDNiqobo/H1wLskvQNYGVgDOA0YL2l0foQ7CZhXydbMelG1Y6o6s2btltA+1n2QzRqo5NRMRBwTEZMiYjKwP/D7iDgQ+APwvnyxQ4BLKv8CZj2kiryCM2s2UlLZx7pANivofwxmmWmYjgL+XdJssv5SZ1bVdrNeMwJ5BWdyCj64AAAgAElEQVTWrDIp7WPdxcKsUcVjmEfEH4E/5q/vAXaudgtmPawNzxxwZs3aKJF9rAtkswapPOXHzJxXs9SkklkXyGYNUnlOvJk5r2apSSWzLpDNGiSSXTPDeTVLTSqZdYFs1iiV9JqZ82qWmkQy6wLZrECi9GNpzaxezqtZWlLKrAtkswZpRNfMwHk1S00qmXWBbNYolfSamfNqlppEMusC2WwZLT0n3sxq5byapSWdzLpANmuQSPcoM8N5NUtNKpl1gWxWINIJr1mvc17N0pJSZl0gmzVI5fKPmTmvZqlJJbMukM0apHJ0a2bOq1lqUsmsC2SzBolk18xwXs1Sk0pmXSCbFYl00mvW65xXs7QklFkXyGYNUukfZWbOq1lqUsmsC2SzAgF9aWTXrOc5r2ZpSSmzLpDNGiUSXjPDeTVLTSKZdYFs1iCVyz9m5ryapSaVzLpANmuQyhA0Zua8mqUmlcy6QDZrkEh2zQzn1Sw1qWS2owrkmTNvXLDKGN1XdzsGMAFYUHcjEtKJv6+NyyyUPQazmvhK2hA4G1gPCGBqRJwmaS3gAmAycC+wX0Q8UclGR5Dz2jU69fc1ZGad1/Kc167Rqb+vEd3HjkReO6pAjoh16m7DQCTNiIgpdbcjFUn/vlTp5Z/FwH9ExExJ44AbJV0JHApcFREnSToaOBo4qrKtjhDntTsk/ftyXktzXrtD8r+v6jLb9rz2VdJMsy6iktNQIuKhiJiZv34auAOYCOwLnJUvdhbw7irbb9ZLnFeztFSR2ZHIa0edQTbrCOWPbidImlF4PzUipg64SmkysANwHbBeRDyUf/Qw2SUiMxsO59UsLRVntl15dYFczoD/iNqgEv59qZUhaBaUudQlaXXgp8BnIuLvxf5XERGSYlhNtcEk/PevFgn/vpzXLpDw379aJP77qjaz7cyru1iUMNhZBhtYyr+v/qf8lJlKrU8aQxbecyPiZ/nsRyStn3++PjC/DV+lZ6X8968OKf++nNf0pfz3rw6p/76qzGy78+oC2axRRZ0alR3KngncERHfKnx0KXBI/voQ4JKKWm7We5xXs7RUkNmRyKu7WJg1qPApP68HDgJulfSXfN4XgJOACyUdBtwH7FfVBs16jfNqlpaKMtv2vLpAbkLSXsBpwCjgBxFxUs1N6liSfgjsA8yPiG3rbs+KqGrYqIi4hsGPg3evZivWz3ltTbdk1nlNlzNbXrfkFarJ7Ejk1V0sBiFpFPAd4O3A1sABkraut1UdbRqwV92NqEJVw0bZyHFeh2UaXZBZ5zVNzmzLptEFeYV0MusCeXA7A7Mj4p6IeAE4n2x8PRtARFwNPF53O1aYsqPbMpN1FOe1RV2RWec1Zc5sC7oir5BUZl0gD24i8EDh/dx8nnUxAZJKTdZRnNce5LwmzZntQSll1n2QzRrUH0szK8t5NUtLKpl1gTy4ecCGhfeT8nnW5TrgwNVa57z2KOc1Wc5sj0ols+5iMbgbgC0kbSJpLLA/2fh61uVU8j/rKM5rj3Jek+XM9qhUMusCeRARsRj4JHAFcAdwYUTMqrdVnUvSecC1wJaS5uZjEKYplVtsbSnntXVdk1nnNUnObGu6Jq+QTGbdxaKJiLgcuLzudqQgIg6ouw1VkMo/ltY6i/Pamm7IrPOaNme2vG7IK6SVWRfIZg064dKOmZXjvJqlJZXMukA2a5RGds0MnFez1CSSWRfIZg0Sya6Z4byapSaVzLpANmuQyhA0Zua8mqUmlcy6QDZbRmcML2NmZTivZmlJJ7Me5q0kSUsk/UXSbZIukrTqCqxrN0m/zF+/S9LRTZYdL+nfhrGNEyR9ruz8hmWmSXpfC9uaLOm2VtvYibLHYKbxnHhrzpltunxXZNZ57R7Oa9PluyKvkFZmXSCXtygito+IbYEXgI8XP1Sm5d9nRFwaESc1WWQ80HJ4bfhSCa8NyZntAc5r13Bee0QqmXWBPDx/AjbPj+ruknQ2cBuwoaQ9JF0raWZ+FLw6gKS9JN0paSbwnv4VSTpU0un56/Uk/VzSzfn0j8BJwGb5kfXJ+XKfl3SDpFsknVhY17GS/irpGmDLob6EpI/m67lZ0k8bjtjfKmlGvr598uVHSTq5sO2PregvshOl8pQfa4kz26WZdV67kvPapXmFdDLrArlFkkYDbwduzWdtAXw3IrYBngX+E3hrROwIzAD+XdLKwPeBdwI7Aa8cZPXfBv43IrYDdgRmAUcDf8uPrD8vaY98mzsD2wM7SXqTpJ3IHtW5PfAO4LUlvs7PIuK1+fbuAIpP5pmcb2Nv4Iz8OxwGPBURr83X/1FJm5TYTjpKHtl2wtGtlePMdnFmndeu47x2cV4hqcz6Jr3yVpH0l/z1n4AzgQ2A+yJiej5/V2Br4M/K/u+OJXs05FbAnIi4G0DSj4HDB9jGW4CDASJiCfCUpDUbltkjn27K369OFuZxwM8jYmG+jTLPtN9W0lfILjGtTvbIz34XRsRLwN2S7sm/wx7Aa/Ry36lX5Nv+a4ltJUH5ZF3Bme3yzDqvXcV57fK8QlqZdYFc3qKI2L44Iw/os8VZwJWNj4SUtMzPrSABX4uI/2nYxmeGsa5pwLsj4mZJhwK7FT6LhmUj3/anIqIYciRNHsa2O5Y64dDVquDM9kBmndeu4bz2QF4hncy6i0W1pgOvl7Q5gKTVJL0KuBOYLGmzfLnBnql+FfCv+c+OkvQK4GmyI9d+VwAfLvS7mihpXeBq4N2SVpE0juxS01DGAQ9JGgMc2PDZ+yX15W3eFLgr3/a/5ssj6VWSViuxnaSkcvnHKuHMJs557SnOaxdIJbMukCsUEY8ChwLnSbqF/NJPRDxHdrnnV8puIJg/yCo+DbxZ0q3AjcDWEfEY2eWk2ySdHBG/BX4CXJsvdzEwLiJmAhcANwO/Bm4o0eQvAtcBfyb7B6bofuD6fF0fz7/DD4DbgZnKhpz5H7rwKoRKTkOuJ7tp5C5Js9VkmCGrjzObvqryCs5sp3Neu0Mq+1hFNJ7lN+tdO+40Ja6ZXubfPVhtbN+NETFloM8kjSLrN/Y2YC7ZP6YHRMTtVbXVrNdVlVdwZs1GQkr7WJ9BNmtQ0RA0OwOzI+KeiHgBOB/Yt+2NN+sxFQ4Z5cyajYBU9rFdd+rebEXcNPPGK1YdqwklF19Z0ozC+6kRMTV/PRF4oPDZXGCXKtpoZpkK8wrOrFnbpbSPdYFsVhARe9XdBjMrx3k1S0tKmXUXC7P2mAdsWHg/KZ9nZp3JmTVLR9vz6gLZrD1uALaQtImksWRPYCozsLyZ1cOZNUtH2/PqLhZmbRARiyV9kmxcy1HADyNiVs3NMrNBOLNm6RiJvHqYNzMzMzOzAnexMDMzMzMrcIFsZmZmZlbgAtnMzMzMrMAFspmZmZlZgQtkMzMzM7MCF8hmZmZmZgUukM3MzMzMClwgm5mZmZkVuEA2MzMzMytwgWxmZmZmVuAC2czMzMyswAWymZmZmVmBC2QzMzMzswIXyGZm1vMk/VDSfEm3DfDZf0gKSRPy95L0bUmzJd0iaceRb7GZtdPouhtg1klGrbFxxOJFpZaNRY9eERF7tblJZjaIivM6DTgdOLs4U9KGwB7A/YXZbwe2yKddgO/lf5pZEyntY10gmxXE4kWstOV+pZZ97i/fmdDm5phZE1XmNSKuljR5gI9OAY4ELinM2xc4OyICmC5pvKT1I+KhUo0x61Ep7WNdIJsVSdA3qu5WmFkZreV1gqQZhfdTI2Jq89VrX2BeRNwsqfjRROCBwvu5+TwXyGbNJLSPdYFs1kjVdM2X9ENgH2B+RGzb8Nl/AN8E1omIBcr2vqcB7wAWAodGxMxKGmLWzcrndUFETCm9WmlV4Atk3SvMrCoV7WPbLY1Wmo0kqdw0tGnAcv2nSvRpPJysT6OZDaW6vDbaDNgEuFnSvcAkYKakVwLzgA0Ly07K55nZUNqX2Uq5QDZbhrKj2zLTECLiauDxAT7q79MYhXlL+zRGxHRgvKT1q/hGZt2rurw2iohbI2LdiJgcEZPJulHsGBEPA5cCB+ejWewKPOX+x2ZltC+zVau/BWadpvzR7QRJMwrT4UOv+uU+jQ0fDdan0cyaqehslKTzgGuBLSXNlXRYk8UvB+4BZgPfB/6tiq9i1hMSOYPsPshmRcJ9Gs1S0Vpem4qIA4b4fHLhdQCfqGTDZr2kwsy2mwtks2W09Q7bYp9GeLlP4864T6PZMKRzR7yZQUqZTaOMNxtJbbr84z6NZm2QyOVaM8tV1y2qrU+/dIFstozqbiBwn0azdkvnhh8zg4ozO402jhTlLhZmRaKys03u02jWZhXm1cxGQLX72LY+/dIFslkjn20yS4fzapaW8pmt9emXLpDNliEYlcYNBGbmvJqlpaXM1jpSlAtks6KEhqAx63nOq1la2pvZSkeKcoFs1sh9Gs3S4byapaVNmY2IW4F1X96M7gWmRMQCSZcCn5R0PrALJUaKcoFstgz5jJRZMpxXs7RUl9l8pKjdyPoqzwWOj4gzB1n8cuAdZCNFLQQ+NNT6/S8LIOkEST8ege1Mzsfla/nARNJu+V+AwT6fJukrK9ZCAzyuagKcWVvKee14zqsto6LMRsQBEbF+RIyJiEmNxXH+zIEF+euIiE9ExGYR8Q8RMWPgtb6sJwpkSc8UppckLSq8P7Du9nUDSZ+V9LCkv+eDd69U4meOy/8xe+tItLE0j6taO2e2/cpmtlB0FP+ffHGk2zso57V2zmv7tbKPlbSqpO9KWiDpKUlXj2Rbh5RIZutvwQiIiNX7J7KBo99ZmHduK+sazpFp3SSNk7RKG9e/J3A0sDuwMbApcOIQP7MZ8H6aDLFSC+WPwSwzWds4s52XWWB84f/Bl9vVtpY4rx3Bee24vE4F1gJenf/52Xa1rWUJZbYnCuSSxko6W9LTkmZJWjq0iKR7JR0l6RbgWUmjJW0g6aeSHpU0R9IRheV3ljQjP9J7RNK3GrZ1oKT786O7Yws/t5KkUyU9mE+nNjmrs4OkmXl7LwBWbvLdtgUelPQ/yh5jXLVDgDMjYlZEPAF8GTh0iJ/5DnAU8EIb2rNifMk2Fc7s8A0ns53JeU2F8zp8pfMqaSvgXcDhEfFoRCyJiBvb0KbhSySzLpBf9i7gfGA8cClwesPnBwB755+/BFwG3Ew20PTuwGfyozyA04DTImINsmFHLmxY1xuALfOfO07Sq/P5xwK7AtsD2wE7A//Z2FBJY4FfAOeQHR1eBLx3sC8WEdcCO5Kdrf2JpDskHSlp/Yb1vkHSk02mNwyyiW3y30W/m4H1JK090MKS3g88HxGXD9bm+vjRtQlxZkcos7n7lD0y/UeSJjRZbgQ5rwlxXkcmrzsD9wEn5gcIt0oatO0jL53M1t+CznFNRFweEUvIQrFdw+ffjogHImIR8FpgnYj4UkS8EBH3AN8H9s+XfRHYXNKEiHgmIqY3rOvEiFgUETeT/UXv39aBwJciYn5EPEp2CeWgAdq6KzAGODUiXoyIi4Ebmn25iJgTESeQ/WPycWAr4HZJv5S0Ub7MNRExvsl0zSCrXx14qvC+//W4xgUljQP+H/DpZu2tVSJHt+bMjkRmgQVkv7+NgZ3yZVq6bN5WzmsqnNeRyesksjPaTwEbAJ8EziocJNQvkcy6QH7Zw4XXC4GVtWxfqOIjCjcGNige+ZE9vWW9/PPDgFcBd0q6QdI+Q2xr9fz1BmRHfv3uy+c12oDsUYrRsOyQ8p+5newfjblkR6arlfnZJp4B1ii873/99ADLngCcExH3ruA226N/EPMEjm7NmV0BpTObFyAzImJxRDxCtsPdIz/YrZfzmhLndfha2ccuIjuA+Ep+cPG/wB+o6OlyKyyhzNbfgnQUg/IAMKfhyG9cRLwDICLujogDyAas/jpwsaQyAXmQ7B+Gfhvl8xo9BEyUljnE2qjZivO+V++TdBlwN9mZoCOATSPijnyZN2rZu5EbpzcOsvpZLHs2YDvgkYh4bIBldweOUHY37sNkT7a5UNJRzdo/ctK5gcCG5MxWk9lG/b/XDth/OK9dxHmtJq+3DDAvBphXk3Qy2wH/wCXpeuBpZTcVrCJplKRtJb0WQNIHJa0TES8BT+Y/81KJ9Z4H/KekdfI+fscBA40deS2wmKzQHCPpPWT9jgYk6TVkgf80Wb+qDSPi4Ij4Q/EIOSL+FIW7kQeY/jTIJs4GDpO0taTxZH26pg2y7O5kl3+2z6cHgY+R3bTXGRI5urWWOLPLKp1ZSbtI2lJSX97n8dvAHyPiqYGWH3HOazdyXpfVyj72arKRRI5RdrPj64E3A1cM+lsZaYlktv4WJCjvQ7UPWYE3h6yP3g+AV+SL7AXMkvQM2c0E++f9qobyFWAG2RHgrcDMfF7j9l8A3kN2F+vjwAeAnzVZ73xg54h4Y0ScGREDXZYZtoj4DfANsss495Ndijq+/3NldywfmC/7WEQ83D8BS4AnIuKZKtu0QhLpH2XlObPLtad0ZsmGlPoN2eXc24DnyW6o6gzOa9dxXpdrTyv72BeBfcmeGvcUWd/tgyPizirbtEISyayW7WJj1tv61pwcK+223E3NA3ruFx+9MSKmDL2kmbWD82qWlpQym9yA3GZt1wFHrmZWkvNqlpZEMusC2axAQF+fex6ZpcB5NUtLSpl1gWxWpHwys87nvJqlJaHMplHGm40YIZWbzKxu1eVV0g8lzZd0W2HeyZLulHSLpJ/nIwj0f3aMpNmS7tLLT3gzs6bS2cd21BnkcePXirXXn1R3M5Lx2DMv1N2EZDz3+MO8+OyTpRLXCcFMgUavEhpb/7MiUrHDq5sOo2oNZs68cUFErDPUchXmdRrZ44/PLsy7EjgmIhZL+jpwDHCUpK3Jnuq2DdlDJX4n6VX56AsdyXltjfPamrJ5hXT2sR1VIK+9/iSOO+uyupuRjLP+PLfuJiRj5rcOK71sKuGtm8aOY6Ut96u7Gcn483Wn192EpKwyRqWeXFZVXiPiakmTG+b9tvB2OvC+/PW+wPkR8TwwR9JssnFyr62kMW3gvLbGeW1N2bxCOvtYd7Ewa+BLtmbpaCGvEyTNKEyHt7ipDwO/zl9PZNlHI8/N55nZEFLpYuEC2axAEuorN5UwjWxA+6IrgW0j4jXAX8ku2dJwyXYv4LuS6n/WplkHazGvCyJiSmGa2sJ2jiV7stq57fouZr2g4n1sW7lANmtQ1dFtRFxN9hSm4rzfRsTi/O10oL/T/dJLthExB+i/ZGtmTbT7bJSkQ8me6nZg4bHB84ANC4tNyueZ2RB8BtksUb5ka5aOdu5sJe0FHAm8KyIWFj66FNhf0kqSNgG2AK5f4S9j1gNSKZA76iY9s07QQjAXDPcxmL5ka1aNqnakks4DdiM78J0LHE/WBWol4Mp8O9Mj4uMRMUvShcDtZDn+RCePYGHWSSrM7A/Jru7Mj4ht83knA+8EXgD+BnwoIp7MPzsGOAxYAhwREVc0W78LZLOiERjEvHDJdndfsjVbARXmNSIOGGD2mU2W/yrw1Wq2btYjqt3HTqONQzO6i4VZgRB9fX2lpmGt35dszSrT7ryaWbWqzGy77/PxGWSzBr5ka5aOTuiraGbltZDZCZJmFN5PbWX0GbL7fC7IX08kK5j7DXmfjwtks0a+ZGuWDtfHZmkpn9la7/NxgWxWJJ+RMkuG82qWlhHIbFX3+bhjllmDVIagMTPn1Sw1qQzN6DPIZg28MzVLh/NqlpZU7vNxgWxWIDrjEZdmNjTn1SwtVWa23ff5uEA2K3KfRrN0OK9maUkosy6QzRqkEl4zc17NUpNKZl0gmzVIJbxm5ryapSaVzLpANmuURnbNDJxXs9QkklkXyGYFkvxYWrNEOK9maUkpsy6QzRqkcvnHzJxXs9SkklkXyGYNUgmvmTmvZqlJJbMukM0apZFdMwPn1Sw1iWTWBbJZg1SObs3MeTVLTSqZdYFsVpTQIOZmPc95NUtLQpl1gWxWIESfH11rlgTn1SwtKWXWBbJZg0QObs0M59UsNalk1gWyWYNULv+YmfNqlppUMusC2axI6RzdmvU859UsLQll1gWyWYEgmf5RZr3OeTVLS0qZdYFs1iCV8JqZ82qWmlQym8YDsUfQke9+Pcf9y56c8MG386VD3rl0/lUXTuPY/d7CF/d/Gxf999dqbGFnee8O6/Ojg7Zn2sE78L4d1gfgw6/biB9+cHt+cOB2fPM9W7P2amNrbmUL8ss/ZSarxxnHH8h9V32NGRd9YbnPPn3QW1h00+msPX41AF41eT3+eNZ/8OR1p/CZg3Yf6aZ2tG+fego7brcNO22/LQd/8ACee+65upvUOue147WS1zVWX5mLT/0Y111wNDdefCwHvWvXkW5ux/rYRz7MRhusy07bb1t3U1ZMQpl1gTyAz3/3PE748a857qzLALhzxv9x09VXcsKPf82Xz7+SPQ/8aM0t7AybrL0q+2y7Hh8/7xYOO+cmXrfpWkx8xcqcf+M8Pvzjv/CRc2/m2nue4JBdN6y7qaWJ7AaCMpPV45zLprPvJ76z3PxJ641n911fzf0PPb503hNPPct/fP0iTj379yPZxI43b948vvudb/Pn6TO48S+3sWTJEi664Py6m9WyKvMq6YeS5ku6rTBvLUlXSro7/3PNfL4kfVvSbEm3SNqxfd8yba3k9WP7vYk773mYXT5wEnt+9DRO+vd/ZszoUSPZ3I510CGHcskvf1N3M1ZYSvtYF8gl/OFn5/KOg/+VMWNXAmCNtSbU3KLOsPFaq3DHw8/w/OKXWBJw89yneNMWa7PwhSVLl1l5TB9E1NjKVpULrne49fnzzL/x+FMLl5v/jc+9l2NP+wVR+Pv26BPPcOPt9/Pi4iXLLd/rFi9ezKJFi7I/Fy5k/Q02qLtJw1BdXoFpwF4N844GroqILYCr8vcAbwe2yKfDge9V8nW6UCt5DWD11bL97GqrrMQTTy1k8ZKXRqqpHe0Nb3wTa621Vt3NqEClmW0rF8gNhPjWEQfxpYP34X9//hMAHrn/Hv76l+v5yof35esf3485t99ccys7w5zHFvKaiWuwxsqjWWl0H7tOXpN1V8+6U3zkHzfioo9M4a1brcOZ195fc0tbU+Hln2l4hzsi9tntH3hw/pPc+td5dTclCRMnTuQzn/0cr9p0IzbZcH3WWOMVvPVte9TdrGGpKq8RcTXweMPsfYGz8tdnAe8uzD87MtOB8ZLWr+Ybdb/B8nrG+f/LVpu8knt++1VmXPQFPnfyxcsU0NYd3MUCkLSXpLvys2JHD/0T9Tt66sUcf/av+Myp0/j9xWdz103XsWTJEp79+1Mce+YveP+nvsAZX/iEQwvc9/gifnLDXL75nm04+Z+3Zvajz7Ik/7X84P/u5/0/mMHv7nyU92yf0H5D2Q0EZaahpLbDTTGvAKusPIYjP7wnX/rer+puSjKeeOIJfnnZJdxx9xzuuf9Bnl34LOed++O6m9W61vI6QdKMwnR4iS2sFxEP5a8fBtbLX08EHigsNzefN6JSzGyzvL7tH1/NLXfNZdM9jmWX/b/GKUe/n3GrrVxDK61tKtzHtlvbCmRJo4DvkJ0Z2xo4QNLW7dpeVdZc95VA1o1ix932ZM6sm1lr3Vey0257IolNt9ke9fXxzJONdU9vunzWfA7/yc0ccdFtPP38YuY+sWiZz6+881HetPnaNbWudS32j+qaHW6qeQXYdNI6bDxxba6/4Bju/NWJTFx3PNf+5CjWW3tc3U3rWL+/6ndMnrwJ66yzDmPGjOHd734P06/9v7qb1bIW87ogIqYUpqmtbCuysyIdc2Yk1cw2y+tB79qVS36fXaG954EF3DvvMbacvN4Qa7SUpHTfQDvPIO8MzI6IeyLiBeB8srNkHev5RQtZ9OwzS1/Puu5PTNzsVezwT3tw543TAXj4/ntY/OKLrD6+G/oCrbjxq4wBYN1xY3nj5mvzu7seZeL4l4/437DZ2tzfUDR3uhYu/3TTDje5vPabNftBNt79GLba+3i22vt45s1/ktf9y9d55LGn625ax9pww424/vrpLFy4kIjgD7+/ii23enXdzRqWNl+ufaT/Sk7+5/x8/jygePfxpHzeSEoys83y+sDDT7DbzlsCsO5a43jV5PWYM29BzS22qqXSjbGd4yAPdEZsl8aF8rNuhwOs/coRv0K1jL8/voDTj8xOAr60ZAm77Lkv//C63Vj84gv86CtH8sUD9mD0mDEcdvx/dUQH8k7w5XduyRorj2HxS8Gpv7+HZ55fwpFv25wN11yFCHjk6ef5r9/9re5mtqTN/28fkbR+RDzUYTvclvPKmNVHpGGNzvraobxxpy2YMH51Zv/my3z5jMs56xfXDrjsemuP48/nHsm41VbmpQg+eeBu7PDer/L0swkOaVahnXfZhX9+z/t43c47Mnr0aLbbbgcO+2iZCyCdp815vRQ4BDgp//OSwvxPSjqfLCdPFa4MjZQhM5taXk/6/m+YeuIHueHCLyDBsaddwmNPPjvCLe5MB3/wAP70v39kwYIFbDZ5El887kQO/fBhdTdrWKrKbERcLWlyw+x9gd3y12cBfwSOotCNEZguaXz/vniw9df+oJD8rNtUgMmvfk2tZ9PWmbgRJ567/DAqo8eM5aMnnlpDizrfpy68bbl5x/3yrhpaUp02H/t08g53SMW89q26bi15PeSYaU0/32rv45e+fuSxp9l8ry+2uUVp+uLxJ/LF40+suxkrrKq8SjqPbMc6QdJc4HiynF4o6TDgPmC/fPHLgXcAs4GFwIeqaUW1UsvrQ48+xTv/bfkh4QzO/vF5dTehMi1kdoKkGYX3U0tcqW21G2MtBXLdZ8TMWqfqjm4T2+E6r5aeCvMaEQcM8tFyT5jJz0J9opIND58za+lpLbMLImLKcDcVESFp2AeG7SyQbwC2kLQJWWj3B/6ljdszW2Giumkz/bsAACAASURBVLtnE9vhOq+WnCrzmiBn1pIzApmtrBtj227Si4jFwCeBK4A7gAsjYla7tmdWlVTGaKyS82qp6sW8gjNr6WpzZvu7McLy3RgPzkez2JUS3Rjb2gc5Ii4nu3RsloxevQHTebUU9WpewZm1NKXSjbH2m/TMOkqXnm0y60rOq1laKsxsu7sxukA2K+gfxNzMOp/zapaWlDLrAtmsQQ/f9GOWHOfVLC2pZNYFslmDVI5uzcx5NUtNKpl1gWxW5D6NZulwXs3SklBmXSCbFQglc3Rr1uucV7O0pJRZF8hmDRLJrpnhvJqlJpXMukA2a9CXSnrNzHk1S0wqmXWBbFYgpXOHrVmvc17N0pJSZgctkCWt0ewHI+Lv1TfHrH6JZHc5zqz1IufVLC2pZLbZGeRZQJCN69yv/30AG7WxXWa1SeUGggE4s9ZznFeztKSS2UEL5IjYcCQbYtYpEsnucpxZ60XOq1laUslsX5mFJO0v6Qv560mSdmpvs8zqIfJhaEr818mcWesFzqtZWlLK7JAFsqTTgTcDB+WzFgJntLNRZrWRGNVXbupUzqz1DOfVLC0JZbbMKBb/GBE7SroJICIelzS2ze0yq00ql3+acGatZzivZmlJJbNlCuQXJfWR3TSApLWBl9raKrOaiHTGaGzCmbWe4LyapSWlzJbpg/wd4KfAOpJOBK4Bvt7WVpnVSCo3dTBn1nqG82qWllQyO+QZ5Ig4W9KNwFvzWe+PiNva2yyz+qQyBM1gnFnrJc6rWVpSyWzZJ+mNAl4kuwRUauQLsxRJdMTNARVwZq3rOa9maUkps2VGsTgWOA/YAJgE/ETSMe1umFldVHIacj3SZyXNknSbpPMkrSxpE0nXSZot6YJ23IzjzFovqSqvdXFerdekktkyZ5APBnaIiIUAkr4K3AR8rZ0NM6tLFZd/JE0EjgC2johFki4E9gfeAZwSEedLOgM4DPjeCm9wWc6s9YwqL9dK+izwEbIzubcCHwLWB84H1gZuBA6KiBcq26jzaj0mlS4WZS7lPMSyhfTofJ5Z18nusC03lTAaWEXSaGBVsty8Bbg4//ws4N1t+BrOrPWEKvNaOKidEhHbknV72J/shrlTImJz4Amyg9oqOa/WMyrObFuv0g56BlnSKWRH0Y8DsyRdkb/fA7hhuBs062hSK0e3EyTNKLyfGhFTASJinqRvAvcDi4Dfkp19ejIiFufLzwUmVtNwZ9Z6UGt5LaP/oPZFlj2o/Zf887OAE6jgqo/zaj2posyOxFXaZl0s+u+inQX8qjB/+nA2ZJaKFrK7ICKmDLwOrQnsC2wCPAlcBOxVRfuacGat57SQ10EPaKGWg1rn1XpShce0bT2gHbRAjogzh7NCs5SJyu6wfSswJyIeBZD0M+D1wHhJo/Md7iRgXhUbA2fWek+LeR30gBZG/qDWebVe1GJma71KO+RNepI2A74KbA2s3D8/Il413I2adbKKLtneD+wqaVWy8O4OzAD+ALyP7KafQ4BLqthYkTNrvaTCLhYjflCbb8d5tZ7SQmZrvUpb5ia9acCPyAr/twMXAhdU2QizTlLFEDQRcR3ZzXgzye6G7wOmAkfB/2fvvuOlqK//j7/OvXRBAUGUJigIAoqVxNiwJKJiS4xR+RpbNBpjixX1F1sSW4okmkSiCZpYUBNbYqyJsQRQwAZiwYKCSBFRRKVczu+PHciy3rt37mV2Zz8776ePeXB3du7O2ZU3c2bnMzP8yMxmkjsrvhTfIo1DmZWMSPCSUWt2ai23Bd8LeIX/7dRCaXZqx6G8SoYklNk1O7TuvgJYa4c2WmaddmjjNMjt3P1hAHd/090vIhdikapjlrtPfJypMe5+sbsPdPch7n6Uuy9z97fcfZi793P3b7v7shK8DWVWMiHhvKa1U6u8SmYkmNmS79DGuQ7yMjOrAd40s5PIdeMdmrtCkUoXyCUai1FmJTOSzKu7XwxcXDD7LWBYcmv5EuVVMiWJzLr7JDNbvUO7kty1w8eSO+H1DjP7STSv2Tu0cRrkM4H1yF1O46fABsBxzV2hSKWrCeQ2mEUos5IZyqtIWJLKbKl3aBttkKPDTgBLgKOSWKlIpTLiHY6tZMqsZIXyKhKWkDJb7EYh95C7aHm93P2bJalIJE0W7hALZVYyR3kVCUtAmS32DfJ1ZasismG7Vhy53ablXm2wTvn+NWmXEIxlHy6KvWwo94mvR1kzu82WvXnyv78u5yqD1mm30WmXUJWU13gGb9GTex/WNiOurv93c9olVK1QMlvsRiGPl7MQkUoR59IulUiZlSxSXkXCEkpm45ykJ5IZRjh7tyJZp7yKhCWkzKpBFinQIpTdWxFRXkUCE0pmYzfIZta6RDc1EKkYZuHs3TZGmZVqp7yKhCWkzDbax5vZMDN7GXgjejzUzH5T8spEUlJj8aZKpcxKliivImEJJbNxvuj+NTAS+BDA3V8E9ihlUSJpMos3VTBlVjJDeRUJSyiZjTPEosbdZxV8JV5XonpEUmUQzEXMi1BmJROUV5GwhJTZOA3ye2Y2DHAzqwVOBV4vbVki6akNI7vFKLOSGcqrSFhCyWycBvlkcoeAegPzgMeieSJVxyyc22AWocxKJiivImEJKbONNsjuPh84vAy1iFSEQLLbIGVWskR5FQlLKJlttEE2sz9Qz/3i3f3EklQkkrJKOHt2XSizkiXKq0hYQslsnCEWj+X93AY4BHivNOWIpCukEwiKUGYlE5RXkbCElNk4QyzG5z82sz8DT5esIpGUBZLdBimzkiXKq0hYQslsc2413RfolnQhIhXBoDaU9ManzEp1Ul5FwhJQZuOMQf6I/42PqgEWAeeXsiiRtOQO/6RdxbpRZiUrlFeRsISU2aINsuWuXD4UmBPNWuXuXzqZQKSahBLe+iizkjXKq0hYQsls0VtNR0F90N3roknBlapnZrGmSqTMStYoryJhCSWzRRvkyAtmtm3JKxGpAKsP/8SZYr2eWUczu9vMXjWzGWa2k5l1NrNHzeyN6M9OCb8NZVYyIem8pkR5lcxIMrOl3r422CCb2erhF9sCz5nZa2Y21cyeN7OpzV2hSEUzqK2xWFNMY4CH3H0guUOpM8iNL3zc3fsDj5PQeENlVjIn+byWjfIqmZRsZku6fS02BvlZYDvgwOa+uEhokjyBwMw2AHYDjgFw9+XAcjM7CBgeLXYz8ARwXgKrVGYlU0I64aceyqtkTlKZLcf2tViDbNFK32zOC4uEqglDn7qY2eS8x2PdfWze477AAuBPZjYUmAKcDnRz97nRMh+Q3CWdlFnJnCSHKppZR+BGYAi5K0scB7wGjAf6AO8Ah7n7R0msDpRXyZ6EMlvy7WuxBrmrmf2ooSfd/ZfNXalI5TJqiJ3ehe6+Q5HnW5D7huhUd59kZmMoONzj7m5mSZ2Yo8xKxjQpr3GsPmR7qJm1AtoBF5A7ZHulmZ1PLsNJHPFRXiWDmpTZYl9ClXz7WqxBrgXaQ7L/+ohUMiPRb6RmA7PdfVL0+G5yAZ5nZpu4+1wz2wSYn9D6lFnJlCTzmsKQKOVVMqeJmS32JVTJt6/FGuS57n5Zc19YJEgGLRIa1OjuH5jZe2Y2wN1fA/YCXommo4Eroz/vS2SFyqxkTdPyWmlDopRXyZ6EtrHl2L42OgZZJEsS/gYZ4FTg1uhw7VvAseSuHnOnmR0PzAIOS2hdyqxkSoLfRkH5h0Qpr5I5CW9jS7p9LdYg79XcFxUJWU2C6XX3F4D6NsqlyJcyK5mTYF7LPSRKeZVMSiqzpd6+NngdZHdflMQKREJjFm+qNMqsZFFSeXX3D4D3zGxANGv1Idv7yR2qhQSHRCmvklWhbGOLfYMskjlGvNtLikj6SpDXcg6JEsmckLaxapBF8hkVcQ94EYkh4byWeUiUSPYEtI1VgyySx4DaQMIrknXKq0hYQspsKN90l90XX3zBLjsNY9h2Q9lu6GAuv/TitEuqCL+/eBSzHr+CyXdd8KXnTj9qTz5//jo27LjeWvO3H9SbJc+N4ZC9tylXmevEYk6SvpNPPJ6+vTZm2HZbr5l3z1/vYsdtt2L9ti2YOmVykd/Oht9f8C1m/eNCJv/l9DXzfnzC13n2ltOYOO5UHrj2ODbp0mHNc7tu25eJ405lyl/O4JHrT0ij5CZRXsPx/pzZjDpkBPvsuh0jdtuecWOvB+DB+//GiN22p//G6/HyC1NSrjJdv/3+13jrhsOYdM3/7kD+k1HbM+UXBzPhqgO47Ud7sEG7lmueG9y7E49fti/PXnMQE68+kNYtK7+tCyWzlf9JpqR169Y89Oi/eHbqi0ya/AKPPPwQkyZOTLus1P35gYkcdMr1X5rfs1tH9vrqlrw7d+3zTmpqjJ+cfhCPTXy1XCWus1BOIBAYddTR3HP/g2vN23LwEG4dfzc777JbSlVVlj8/OIWDzvzTWvN+deuTDPvur/nqMb/hn8+8yuhjcyMINmjfhjFnH8S3z7uF7f/vWkZddFsaJTeJ8hqOFi1qGX3pFTz81FTufvAJ/vKnG3jjtRlsMXAQv/3j7ey40y5pl5i6W//zJodc8dha8/718lyGnXMfO533ADM/+JizDt4KgNoa48ZTduH0Gycy7Jz72O+yh1mxMqmrEJZOKJlVg9wAM6N9+/YArFixgpUrVgQzbqaUnpn6Jos+/uxL868++1tcOOZe3NcO5w8O3517H3+RBYuWlKvEdWSYxZskfbvsuhudOnVea97AgVuyxRYDGviN7HnmhXdY9MnamV3y2bI1P7dr03JNbr/zjW247z/TeW/exwAs+Ghp+QptFuU1JBt124QhW28LQPv2Hdi8/wDmffA+/bYYyGb9tki5usrwzKvz+GjpsrXm/eul96lblcvoc28spHvn3FHavbbuzrR3P2Laux8BsOjTZazySm+Qw8msGuQi6urq+Mr229C7+0bsuffXGfaVr6RdUkUaOXwr3p+/mJdfn7PW/O5dN+DAPYcy9q6nUqqs6VafYRtnEgnZJd//Bm/ccx6H77MNl9+Y+8aqf68udOzQloevO4Fn/vhDjhyxbcpVFqe8hmv2u7N4ZdqLDN1ux7RLCcpRw/vx6Au5bW2/TdbHgXtG781TV4zkjAMGp1tcDCFltmQ1mNkfzWy+mU0r1TpKrba2lklTXmDmO7OZ/NyzTJ8W7FspmbZtWnLucftw2e/+8aXnrjnnW1w05r4vfatc6WrMYk3VphoyK/FdcsMj9D/kKu54+AVO+tZOALSorWG7AT045OxxHHjmHxl97J7069Ul5UqLU17Dy+vSpZ9yyvFHcNHlV9Ohw/pplxOMsw/eipV1zvin3wJyed1pwEZ877qn+MbF/+SAHXuz+5CNU66ycaFktpRN+jhgRAlfv2w6duzI7sP34JFHHkq7lIqzWc+ubNpjQ54dP5pX/3EpPTbqyITbzqPbhh3YblBvbrnyWF79x6Ucsve2XDv6OxwwfOvGXzRN0SVoQjj8UwLjqJLMSnzjH3mBg/fIffM0Z8HHPDrpDT77YgUffvwZT7/wNlv3q+ANrvIaXF5XrFjBKccdyYHfOpx99j847XKCMWr3zdl3u54cf92Ta+bN+XAp/50xjw+XLOPz5XU8/MIctumzYYpVxhBQZkvWILv7k0CwdwpasGABixcvBuDzzz/n8cceZcCAgSlXVXmmz3yfTfcazcD9L2bg/hczZ/5idjryKuZ9uIQtR16yZv49jz3PGVeM54EnXkq75KJCOvyTtNAzK/Ft3vN/G9GRuw7i9VkLAHjgyVf42tBNqa2toW3rluw4uBevRs9VIuU1rLy6O6PPPJl+/Qdw/EmnpV1OMPYe2p0zDhjCd675F58vr1sz//GX3mdQ7060bVVLbY2xy5bdeHXO4hQrbVxImU39OshmdiJwIkCv3r1TruZ/Ppg7lxOOO5q6ujpW+Sq+dehh7Lf/yLTLSt3NVxzDrtv3p0vH9sx86HIu//2D3HzvhLTLSlQl7LlWqrXy2iv9vB571JE89dR/+HDhQgZs3psLLrqYTp07c86PTmfhggUcesgBbL31UO79e3aP/tx86eHsum1funRcj5n3ns/lNz7GiJ0G0H/TLqxa5bz7wWJOu/peAF6btYBHJ77Oc7ecxip3xt0/mVfempfyOyhOeW1Yfl679+yVcjUw5dkJ3HvXbQzYcggH7Jk7p+esCy5l+fJlXHrBWSz6cCHfG/UtthyyNePG359yten446m7seugbmzYoQ2vXn8oP7v7BX500Fa0blnLfRd+A4Dn3ljAGTdNZPHS5Vz3j1f4z09H4jiPPD+Hh5+f08ga0hdKZq2U40PNrA/wd3cfEmf57bffwZ+ZpOuWxtVpxx+mXUIwlr12J6s+m99oKvsNHuo/v/3hWK95yNBNprh7fXfdClZTMrvd9jv4k/99tuQ1VYuue1yYdglB+WLClY3mS3m1PsTM61bbbOf3PvJMyWuqFtucdmfaJQTl0/HHxMpXSJlN/RtkkUoTyM6tiKC8ioQmlMyqQRbJE9JtMEWyTnkVCUtImS3lZd5uByYAA8xstpkdX6p1iSTHYv9XbZRZCY/yivIqQQknsyX7BtndjyjVa4uUUiA7t4lTZiVEyqtIWELJrIZYiOTJXYImkPSKZJzyKhKWkDKrBlkkn4WzdyuSecqrSFgCyqwaZJEClXCLSxGJR3kVCUsomVWDLJLHgJowsiuSecqrSFhCymwl3M1PpKIkeYatmdWa2fNm9vfocV8zm2RmM81svJm1KumbEalyoZwRLyI5oWxj1SCLFDCLN8V0OjAj7/FVwK/cvR/wEaBLM4msg4TzKiIlFso2Vg2ySIGk9m7NrCewP3Bj9NiAPYG7o0VuBg4u0dsQyQR9gywSllC2sRqDLJLHsCTv8nMtcC7QIXq8IbDY3VdGj2cDPZJamUjWJJxXESmxJma2i5lNzns81t3H5j0u6TZWDbJIvqYd2mkwvGY2Epjv7lPMbHiyRYoIENQlo0SEpmZ2obvvUO/LlGEbqwZZpEATtrcNhhfYGTjQzPYD2gDrA2OAjmbWItrD7QnMWbdqRbIt6f7YzGqBycAcdx9pZn2BO8h9OzUFOMrdlye8WpHMSCizJd/GagyySJ7cJWgs1lSMu492957u3gc4HPiXu48C/g0cGi12NHBfCd+OSFVLKq8FdGKtSImEtI1VgyxSwGJOzXQe8CMzm0nuG6mb1q1akWxLMq86sVak9ELZxmqIhUihhI/ZuvsTwBPRz28Bw5Jdg0iGJXDOQB6dWCtSaoFsY9UgixQI5TaYItKkvBY7Z0An1oqUSSjbWDXIIgXCiK6IQKJ51Ym1ImUQyjZWY5BFCpV4gJSIJCihvOrEWpEyCWQbqwZZJE8ul7ozl0gIypRXnVgrkpCQtrEaYiGSTzceEAlHifKqE2tFSiSgbawaZJECoYRXRJRXkdCEklk1yCJrqYxDOyISh/IqEpZwMqsGWaRAKHu3IqK8ioQmlMyqQRbJUyEnz4pIDMqrSFhCyqwaZJFCoaRXRJRXkdAEklk1yCIFQhkfJSLKq0hoQsmsGmSRAjVhZFdEUF5FQhNKZtUgi+QLaYCUSNYpryJhCSizapBFCoRy+EdElFeR0ISSWTXIInmMcC5BI5J1yqtIWELKrBpkkQKBZFdEUF5FQhNKZtUgixSwUHZvRUR5FQlMKJlVgyxSIJDsigjKq0hoQsmsGmSRAoFkV0RQXkVCE0pmK6pBnjp1ysK2LW1W2nXUowuwMO0iAlKJn9emsZcMJb0pe37qlIUd2tQqr+Gr1M8rXmaV11imvfj8wn7d2imv4avUz6vqtrEV1SC7e9e0a6iPmU129x3SriMUIX9euUs0BpLelCmv1SHkz0t5jU95rQ6hf15JZdbMegG3AN0AB8a6+xgz6wyMB/oA7wCHuftHzVlHzTpXKVJNLDc+Ks4kIilTXkXCklxmVwJnufsg4KvAKWY2CDgfeNzd+wOPR4+bRQ2ySIGkNrhm1svM/m1mr5jZdDM7PZrf2cweNbM3oj87lfo9iVQrNcgiYUkis+4+192nRj8vAWYAPYCDgJujxW4GDm5unWqQ4xmbdgGBCfjzstj/xVDyPVypV8B//1IR8OeVaF4lHQH//UtF4J9XkzLbxcwm500n1vuKZn2AbYFJQDd3nxs99QG5IRjNUlFjkCuVuwf+F7K8Qv+8kvq2KQrp3OjnJWaWv4c7PFrsZuAJ4Lxk1iqh//0rt9A/L307HLbQ//6VWzV8Xk3I7MLGxlubWXvgr8AZ7v5J/jWW3d3NzJtbpxpkkTxGk06w7WJmk/Mej23oH69S7eGKZFkT8yoiKUsys2bWklxzfKu7/y2aPc/MNnH3uWa2CTC/ua+vBlmkUIJ7t1DaPVyRzFOHLBKWBDJruQ3pTcAMd/9l3lP3A0cDV0Z/3tfcdWgMchFmNsLMXjOzmWamcaJFmNkfzWy+mU1Lu5Z1VWMWa4qj2B5u9Pw67eHK/yivTVMtmU0yr1Jeymx81ZJXSCyzOwNHAXua2QvRtB+5xvjrZvYGsHf0uHl1NvcXq52Z1QLXA/sCg4AjohOspH7jgBFpF5EEizk1+jqN7+HCOu7hSo7y2izjqILMJpVXKS9ltsnGUQV5hWQy6+5Pu7u5+9buvk00PejuH7r7Xu7e3933dvdFza1TDXLDhgEz3f0td18O3EHu5Cqph7s/CTT7L2LFSPa6qiXfw5U1lNcmqorMJphXXZax7JTZJqiKvELS29iS0hjkhvUA3st7PBv4Skq1SFklk0x3f7rIi+2VyEpkNeU1sxLbkq6+LONUM+sATDGzR4FjyF2W8cpoGMD56KozSVBmM6sCut8Y1CCL5DEqY89VRBqXZF51WUaR0gtpG6sGuWFzgF55j3tG86TK1QQSXlmL8ppRTcirLstYWZTZjAplG6sGuWHPAf3NrC+50B4OHJluSVIOuutWkJTXjGpCXnVZxsqizGZUKNtYnaTXAHdfCfwQeJjcPb7vdPfp6VZVuczsdmACMMDMZpvZ8WnX1Gw6LT44ymvTVU1mE8yrLstYPsps01RNXiGYbay+QS7C3R8EHky7jhC4+xFp15CUCsilNIPy2jTVktkE78pV8hsPyNqU2fiqJa8QzjZWDbJInkq5vIyINC7hvK6+LOPLZvZCNO8Cco3xndE3drOAwxJbo0jGhLSNVYMsUiCU8VEiklxedVlGkfIIZRurBlmkQCh7tyKivIqEJpTMqkEWKRBKeEVEeRUJTSiZVYMsshYL5vCPiCivImEJJ7O6zFtMZlZnZi+Y2TQzu8vM2q3Daw03s79HPx8Y3b60oWU7mtkPmrGOS8zs7LjzC5YZZ2aHNmFdfcxsWlNrrESr7/ITwn3ipThltujyVZFZ5bV6KK9Fl6+KvEJYmVWDHN/n7r6Nuw8BlgMn5T9pOU3+PN39fne/ssgiHYEmh1dElFmRgCivUlHUIDfPU0C/aK/uNTO7BZgG9DKzb5jZBDObGu0FtwcwsxFm9qqZTQW+ufqFzOwYM7su+rmbmd1jZi9G09fIXWJo82jP+ppouXPM7Dkze8nMLs17rQvN7HUzexoY0NibMLMTotd50cz+WrDHvreZTY5eb2S0fK2ZXZO37u+v6wdZiWrMYk0SFGW2SjOrvFYl5bVK8wrhZFYNchOZWQtgX+DlaFZ/4LfuPhhYClwE7O3u2wGTgR+ZWRvgD8ABwPbAxg28/K+B/7j7UGA7YDpwPvBmtGd9jpl9I1rnMGAbYHsz283Mtid3q85tgP2AHWO8nb+5+47R+mYA+Xfm6ROtY3/g99F7OB742N13jF7/BMvdJrR6xDz0UwHZlZiU2SrOrPJadZTXKs4rBJVZnaQXX1v738XjnyJ3x6XuwCx3nxjN/yowCHjGcv93W5G7NeRA4G13fwPAzP4CnFjPOvYEvgvg7nXAx2bWqWCZb0TT89Hj9uTC3AG4x90/i9Zxf4z3NMTMfkLuEFN7crf8XO1Od18FvGFmb0Xv4RvA1va/sVMbROt+Pca6glAhd7iUZCizVZ5Z5bWqKK9VnlcIK7NqkOP73N23yZ8RBXRp/izg0cJbQprZWr+3jgy4wt1vKFjHGc14rXHAwe7+opkdAwzPe84LlvVo3ae6e37IMbM+zVh35QolvdIYZTYLmVVeq4XymoW8QjCZ1RCLZE0EdjazfgBmtp6ZbQG8CvQxs82j5Rq6p/rjwMnR79aa2QbAEnJ7rqs9DByXN+6qh5ltBDwJHGxmbc2sA7lDTY3pAMw1s5bAqILnvm1mNVHNmwGvRes+OVoeM9vCzNaLsZ6gWMz/pCoos4FTXjNFea0CoWRW3yAnyN0XRHuJt5tZ62j2Re7+upmdCPzDzD4jd/ioQz0vcTow1syOB+qAk919gpk9Y7lLvPwzGiO1JTAh2rv+FPg/d59qZuOBF4H5wHMxSv5/wCRgQfRnfk3vAs8C6wMnufsXZnYjuXFTUy238gXAwfE+nXBUwtgnKQ9lNnzKa3Yor9UhlMyae+G3/CLZtd32O/jTE+P8uwfrtaqZ4u47lLgkEWmA8ioSlpAyq2+QRQpUwqEdEYlHeRUJSyiZ1TfIInnM7CGgS8zFF7r7iFLWIyINU15FwhJSZtUgi4iIiIjk0VUsRERERETyqEEWEREREcmjBllEREREJI8aZBERERGRPGqQRURERETyqEEWEREREcmjBllEREREJI8aZBERERGRPGqQRURERETyqEEWEREREcmjBllEREREJI8aZBERERGRPGqQRURERETyqEEWEREREcmjBllEREREJI8aZBERERGRPGqQRURERETyqEEWEREREcmjBllEREREJE+LtAsQqSS162/qvvLzWMv65wsedvcRJS5JRBqgvIqEJaTMqkEWyeMrv6D1wMNjLfvF87/pUuJyRKQI5VUkLCFlVg2ySD4DzNKuQkTiUF5FwhJQUUFluAAAIABJREFUZtUgixQyDc0XCYbyKhKWQDKrBllkLQY1tWkXISKxKK8iYQkns2qQRQoFcvhHRFBeRUITSGbVIIvkM4I5/COSecqrSFgCyqwaZJG1WDB7tyKivIqEJZzMqkEWKRTI3q2IoLyKhCaQzKpBFllLOCcQiIjyKhKWcDIbRhsvUi6rr9EYZ2rspcz+aGbzzWxaPc+dZWZuZl2ix2ZmvzazmWb2kpltl/ybE6kyyqtIWALKrBpkkUJWE29q3DjgS7fJNLNewDeAd/Nm7wv0j6YTgd+t8/sQyQLlVSQsgWRWDbLIWiyx8Lr7k8Ciep76FXAu4HnzDgJu8ZyJQEcz2ySJdyRSvZRXkbCEk1mNQRYpVBP7DNsuZjY57/FYdx9b7BfM7CBgjru/aGsfQuoBvJf3eHY0b27cYkQySXkVCUsgmVWDLJKvaddoXOjuO8R+abN2wAXkDv2IyLpSXkXCElBm1SCLrKWkZ9huDvQFVu/Z9gSmmtkwYA7QK2/ZntE8EWmQ8ioSlnAyqzHIIoUSOsO2kLu/7O4buXsfd+9D7hDPdu7+AXA/8N3oTNuvAh+7uw7XijRGeRUJSyCZVYMMmNklZvaXMqynT3TZkSZ/c29mw81sdpHnx5nZT9atQgESO4HAzG4HJgADzGy2mR1fZPEHgbeAmcAfgB8k8VaqlTIrayivFU95lbUEktlMDLEws0/zHrYDlgF10ePvl7+i6mNmZwLnkft87wZOdvdl9Sw3Crghb1YN0BbYwd2nlKPWopq551ofdz+ikef75P3swCmJrLgKKLOlFzez0bKHAZeSOyz5HnCBu99brlobpLxWBOW19JqY1+8B5wMbA08Dx7n7++WqtaiAMpuJb5Ddvf3qidx18Q7Im3drU16rOXumaTOzDmbWtoSvvw+5MO4FbApsRm5j+iXufmvB/48fkNurm1qq+posuWs0SjMps5WTWTPrAfwF+BGwPnAOcJuZbVSq+ppEeU2d8lpReR0O/IzcZc06A28Dt5eqtmYJJLPpV1A5WpnZLWa2xMymm9maMyfN7B0zO8/MXgKWmlkLM+tuZn81swVm9raZnZa3/DAzm2xmn5jZPDP7ZcG6RpnZu2a20MwuzPu91mZ2rZm9H03Xmlnr+oo1s23NbGpU73igTZH3NgR438xuiMbeJO1o4CZ3n+7uHwGXA8c04XdvifbuKkB0AkGcSdKmzDZfUzLbE1js7v+MriH6D2ApuRNiUqa8BkR5bb6m5HUkcFe07PJo2d3MrALyCiFlVg3y/xwI3AF0JDeY+7qC548A9o+eXwU8ALxI7jp6ewFnRHt5AGOAMe6+PrmNyJ0Fr7ULMCD6vR+b2ZbR/AuBrwLbAEOBYcBFhYWaWSvgXuDP5PYQ7wK+1dAbc/cJwHbkrvd3m5nNMLNzreAi2Wa2i5ktLjLt0sAqBkefxWovAt3MbMOGaorWtymwG3BLseXKrkQnEEjilNnyZHYyMMPMDjSzWjM7mNwh9Jcaqr+slNdQKK/l28ZaPT8Paaj+sgsks2qQ/+dpd3/Q3evIhWJowfO/dvf33P1zYEegq7tf5u7L3f0tcoO+D4+WXQH0M7Mu7v5pdNeWfJe6++fu/iK5v+ir1zUKuMzd57v7AnKHUI6qp9avAi2Ba919hbvfDTxX7M25+9vufgm5f0xOAgYCr5jZ382sd7TM0+7escj0dAMv3x74OO/x6p87FKsJ+C7wlLu/3chy5bP6Go0BHP4RZbYcmY0+31uA28g1xrcB33f3pcXqLwvlNSTKa3m2sQ8Bh5nZ1pYb9vFjcneUa1es/rIJKLPpV1A5Psj7+TOgja09Fir/DiybAt3z9/zIXZy6W/T88cAWwKtm9pyZjWxkXe2jn7sDs/KemxXNK9Sd3J1ivGDZRkW/8wq5fzRmk9szXS/O7xbxKbmxiaut/nlJI7/3XeDmdVx3wpK7DaaUnDLbfLEza2Z7A1cDw4FWwO7AjWa2zTrWkADlNSDKa/PFzqu7PwZcDPwVeCealkS1VIBwMpt+BeHID8p7wNsFe34d3H0/AHd/w3NnV24EXAXcbWZxAvI+uX8YVusdzSs0F+hhttYxiN7FXjgae3WomT0AvAFsD5wGbObuM6JldjWzT4tMuzbw8tNZ+9uAocA8d/+wSD07k/tH6O5idacikMM/0ihlNpnMbgM86e6T3X2Vuz8HTAL2LlZ/2Siv1UJ5TWgb6+7Xu3t/d+9GrlFuAUwrVn9ZBZJZNcjN8yywxHInFbSNxuUNMbMdAczs/8ysq7uvAhZHv7MqxuveDlxkZl3NrAu5QyP1XTtyArASOM3MWprZN8mNpaqXmW1NLvCnkxtX1cvdv+vu/87fQ3b3pzzvbOR6pqcaWMUtwPFmNsjMOpIb0zWukfd6NPBXd2/sW+byC2TvVppEmV1bUzL7HLDr6m+MzWxbYFcqZgyy8lqFlNe1xc6rmbWJPiuLhnaMJTde+6PiH00ZBZLZ9CsIUDSGaiS5b1beBhYCNwIbRIuMAKZb7tqQY4DDo3FVjfkJuRNiXgJeJnfpsy9dmNxzZ6Z+k9xZrIuA7wB/K/K684Fh7r6ru9+UdFPq7g+ROwT7b3KX+JlF7hAPAJY7Y3lU3uM2wGFU3PAKcnutgZxhK/Eps1+qJ3Zm3f0/wCXkvqVbQu4bqZ+5+yNJ1tQsymtVUl6/VE9TtrFtyJ0n8Cm5HY0JwP9Lsp51ElBmzSvl6loiFaCmUx9vvUe8f0u+uOd7U9x9h8aXFJFSUF5FwhJSZoO7ILdIqVkFjH0SkXiUV5GwhJJZNcgieYxwwiuSdcqrSFhCyqwaZJF8Fk0iUvmUV5GwBJRZNcgiazFqanTuqkgYlFeRsIST2YpqkK1FW7dWjd18TVbbdsuil2WUPLNmvcPChQtj7beGcvgnbcpr0yivTTN16pSF7t61seWU13iU16ZRXpsmbl4hnMxWVoPcqgOtBxyWdhnBeGZS4a3spSE7fyX+ibChhDdtymvTKK9N07alxbpzmfIaj/LaNMpr08TNK4ST2YpqkEVSF9D4KJHMU15FwhJQZtUgi+QxLJi9W5GsU15FwhJSZtUgixQI5QQCEVFeRUITSmbVIIsUCGXvVkSUV5HQhJJZNcgi+QIaHyWSecqrSFgCymwY33OLlJGZxZpivM4fzWy+mU3Lm3eNmb1qZi+Z2T1m1jHvudFmNtPMXjOzfUr09kSqivIqEpZQMqsGWSTP6hMIkggvMA4YUTDvUWCIu28NvA6MBjCzQcDhwODod35rZrVJvS+RaqS8ioQlpMyqQRYpkFR43f1JYFHBvEfcfWX0cCLQM/r5IOAOd1/m7m8DM4Fhyb0rkeqkvIqEJZTMagyySD4Dq4k9QKqLmU3OezzW3cc2YW3HAeOjn3uQC/Nqs6N5ItIQ5VUkLAFlVg2ySIGYh3YAFrp7/Fv0rb2OC4GVwK3N+X0RyVFeRcISSmbVIIsUaEJ4m/v6xwAjgb3c3aPZc4BeeYv1jOaJSBHKq0hYQsmsxiCL5En4BIIvv77ZCOBc4EB3/yzvqfuBw82stZn1BfoDz67zGxKpYsqrSFhCyqy+QRYplNDOrZndDgwnN45qNnAxuTNqWwOPRv8ATHT3k9x9upndCbxC7rDQKe5el0wlIlVMeRUJSyCZVYMsks+Suw2mux9Rz+ybiiz/U+CniaxcJAuUV5GwBJRZNcgiBUo9PkpEkqO8ioQllMyqQRYpFEZ2RQSUV5HQBJJZNcgiBULZuxUR5VUkNKFkVg2ySJ51OXtWRMpLeRUJS0iZVYMsUiCU8IqI8ioSmlAyqwZZpEATboMpIilTXkXCEkpm1SCLFAhl71ZElFeR0ISSWTXIIvksnPCKZJ7yKhKWgDKrBlkkjwGBZFck85RXkbCElFk1yCJrCecMWxFRXkXCEk5m1SCLFKgJ5AQCEVFeRUITSmbVIIvks3AO/4hknvIqEpaAMqsGWSSPEc7erUjWKa8iYQkps2qQRQqEsncrIsqrSGhCyawaZJECoZxAICLKq0hoQslsTdoFpO33F49i1uNXMPmuC7703OlH7cnnz1/Hhh3XA6Bjh7aM/8UJPDt+NE/9+WwGbb5JucutaI88/BBbDx7A4IH9uObqK9Mup3mi8VFxJkmHMpsM5VXKQXlNjjJbXplvkP/8wEQOOuX6L83v2a0je311S96du2jNvHOP34cXX5vNsO9cwfH/78/8/JxDy1lqRaurq+OM007hvgf+yfMvvcJdd9zOjFdeSbusJjOMmpqaWJOkQ5ldd8qrlIvymgxltvzSryBlz0x9k0Uff/al+Vef/S0uHHMv7r5m3sDNNuY/z70OwOvvzGPT7p3ZqHOHstVayZ579lk237wffTfbjFatWvHt7xzO3x+4L+2ymiWUvdusUmbXnfIq5aK8JkOZLb/MN8j1GTl8K96fv5iXX5+z1vyXX5/DQXsOBWCHwZvSe5PO9OjWMY0SK87778+hZ89eax736NGTOXPmFPmNymVmsSapHMps0yivkibltemU2fIraYNsZiPM7DUzm2lm55dyXUlp26Yl5x63D5f97h9feu7nf3qUDTq0Y+Id53Py4bvz4muzqatblUKVUjIBjY9KWoh5BWU20zKcVwgzs8prxgWU2ZJdxcLMaoHrga8Ds4HnzOx+d6/oQTOb9ezKpj025NnxowHosVFHJtx2HrsedQ3zPlzC9y/5y5plX/3Hpbw958O0Sq0o3bv3YPbs99Y8njNnNj169EixoubJ3Sc+mWSa2R+BkcB8dx8SzesMjAf6AO8Ah7n7R5Zb6RhgP+Az4Bh3n5pIIfFqDTKvoMw2h/Jaz2sFlNeotiAzq7w2jzJbz2uVOLOl/AZ5GDDT3d9y9+XAHcBBJVxfIqbPfJ9N9xrNwP0vZuD+FzNn/mJ2OvIq5n24hA3at6Vli1oAjj3kazw9dSZLln6RcsWVYYcdd2TmzDd45+23Wb58OXeNv4P9Rx6YdlnNUlNjsaYYxgEjCuadDzzu7v2Bx6PHAPsC/aPpROB3ibyZ+ILMKyizzaG81msc4eQVAs2s8to8ymy9xlHCzJbyOsg9gPfyHs8GvlK4kJmdSK5YaNm+hOXU7+YrjmHX7fvTpWN7Zj50OZf//kFuvndCvcsO3Gxj/nDZUbg7M96cy0mX3lrmaitXixYt+NWY6zhg/32oq6vj6GOOY9DgwWmX1SxJHdpx9yfNrE/B7IOA4dHPNwNPAOdF82/x3BkrE82so5lt4u5zk6mmUUHkFZTZJCivXxZYXiFGZpXX6qHMflmpM5v6jULcfSwwFqCm3UbeyOKJO3r0uKLPD9z/4jU/T3rpbbY++LISVxSuEfvux4h990u7jHVjTTr808XMJuc9Hhv9fS6mW14gPwC6RT/Xt7HrAZRzg9uotPMKymxSlFfltRyU1+Qos+XNbCkb5DlAr7zHPaN5IhUrNz4q9uIL3X2H5q7L3d3MUtlo1UN5leBkOK+gzEqAQspsKccgPwf0N7O+ZtYKOBy4v4TrE0lAvMvPrMNJBvPMbBOA6M/50fy0N3bKqwQos3kFZVaCFE5mS9Ygu/tK4IfAw8AM4E53n16q9YkkJcETCOpzP3B09PPRwH15879rOV8FPi7neEblVUKVxbyCMivhCiWzJR2D7O4PAg+Wch0iiUrw+otmdju5kwW6mNls4GLgSuBOMzsemAUcFi3+ILnLz8wkdwmaY5OpIj7lVYKT4byCMisBCiizqZ+kJ1JJkrxGo7sf0cBTe9WzrAOnJLJikYxQXkXCElJm1SCLFKiEW1yKSDzKq0hYQsmsGmSRAoFkV0RQXkVCE0pm1SCLFAhl71ZElFeR0ISSWTXIInnM1unsWREpI+VVJCwhZVYNskiBQHZuRQTlVSQ0oWRWDbJIgZpQ0isiyqtIYELJrBpkkQKBZFdEUF5FQhNKZtUgi+QxC+cEApGsU15FwhJSZhtskM1s/WK/6O6fJF+OSPpqAzmBoJAyK1mkvIqEJZTMFvsGeTrg5G58strqxw70LmFdIqkJZOe2PsqsZI7yKhKWUDLbYIPs7r3KWYhIJTDACCS9BZRZyRrlVSQsIWW2Js5CZna4mV0Q/dzTzLYvbVki6amxeFMlU2YlK5RXkbCEktlGG2Qzuw7YAzgqmvUZ8PtSFiWSGjMs5lSplFnJDOVVJCwBZTbOVSy+5u7bmdnzAO6+yMxalbgukdRUQC7XlTIrmaG8ioQllMzGaZBXmFkNuZMGMLMNgVUlrUokJUY4Z9gWocxKJiivImEJKbNxxiBfD/wV6GpmlwJPA1eVtCqRFIVy+KcIZVYyQ3kVCUsomW30G2R3v8XMpgB7R7O+7e7TSluWSDpyFzFPu4p1o8xKViivImEJKbNx76RXC6wgdwgo1pUvREIVyn3iG6HMSiYoryJhCSWzca5icSFwO9Ad6AncZmajS12YSFos5lSplFnJEuVVJCyhZDbON8jfBbZ1988AzOynwPPAFaUsTCQNIZ1AUIQyK5mgvIqEJaTMxjmUM5e1G+kW0TyR6pPgNRrN7Ewzm25m08zsdjNrY2Z9zWySmc00s/ElupyTMivZkPA1VVPKrPIq2RHQNrbBBtnMfmVmvwQWAdPN7EYz+wPwMrCwuSsUqXSrTyJobCr+GtYDOA3Ywd2HkBtjeDi5s9N/5e79gI+A45OrW5mV7Ekir7nXKW9mlVfJqlC2scWGWKw+i3Y68I+8+RObuzKRECR4eZkWQFszWwG0I/et0J7AkdHzNwOXAL9LaH3KrGROwpeDKmdmlVfJpFC2sQ02yO5+U3NeUCRkRpPuAd/FzCbnPR7r7mMB3H2Omf0ceBf4HHgEmAIsdveV0fKzgR5J1B2tU5mVTEkqr1D+zCqvkkUhbWMbPUnPzDYHfgoMAtqsnu/uWzR3pSKVrAmXoFno7jvU94SZdQIOAvoCi4G7gBGJFNgIZVayJIm8QnqZVV4la0LZxsY5SW8c8Cdyjf++wJ3A+CSLEKkUZrnwxpkasTfwtrsvcPcVwN+AnYGOZrZ6x7QnMKcEb2McyqxkQIJ5hfQyOw7lVTIipG1snAa5nbs/DODub7r7ReRCLFKVEjrp513gq2bWznIDrvYCXgH+DRwaLXM0cF8J3oIyK5mR1El6pJdZ5VUyJZRtbJzrIC8zsxrgTTM7iVw33qG5KxSpdEmcQODuk8zsbmAqsJLcdU3HkjsZ5w4z+0k0rxTjEJVZyYykTvhJMbPKq2RKKNvYOA3ymcB65C6n8VNgA+C45q5QpNIldYKtu18MXFww+y1gWDJraJAyK5mR5EUsUsqs8iqZEso2ttEG2d0nRT8uAY5KYqUilcqIPV6xYimzkhXKq0hYQspsgw2ymd0DeEPPu/s3S1KRSJoMagK5DWYhZVYyR3kVCUtAmS32DfJ1ZasiMqh/T+76x1XlXm2wen7vjrRLCMbiWYtiLxvnzNUKVdbMbrF5D2668/JyrjJoW1/wUNolVCXlNZ6evbtx1q/PKucqg3bkzVPSLqFqhZLZYjcKebychYhUAiPxO3OVjTIrWaO8ioQlpMzGOUlPJFMCOfojIiivIqEJJbNqkEUKhBJeEVFeRUITSmZjN8hm1trdl5WyGJG0mUFtKOlthDIr1U55FQlLSJltdKy0mQ0zs5eBN6LHQ83sNyWvTCQlCd6ZKxXKrGSJ8ioSllAyG+dkwl8DI4EPAdz9RWCPUhYlkhYjsfvEp0mZlUxQXkXCElJm4wyxqHH3WQVnHdaVqB6R1IVyCZoilFnJDOVVJCyhZDZOg/yemQ0D3MxqgVOB10tblkh6KmDHdV0ps5IZyqtIWELJbJwG+WRyh4B6A/OAx6J5IlXHKuTQzjpSZiUTlFeRsISU2UYbZHefDxxehlpEKkJtKMd/GqDMSpYoryJhCSWzjTbIZvYH6rlfvLufWJKKRFK0+gSCkCmzkhXKq0hYQspsnCEWj+X93AY4BHivNOWIpC+Q7BajzEpmKK8iYQkls3GGWIzPf2xmfwaeLllFImmycO7y0xBlVjJDeRUJS0CZbc6tpvsC3ZIuRKRSGIGkNz5lVqqW8ioSllAyG2cM8kf8b3xUDbAIOL+URYmkxYAWgZxA0BBlVrJCeRUJS0iZLdogW+7K5UOBOdGsVe7+pZMJRKqJhTJAqh7KrGSN8ioSllAyW7SPj4L6oLvXRZOCK1Utd4ZtvKkSKbOSJcqrSFhCymycL7pfMLNtS16JSCWw3Bm2caZYL2fW0czuNrNXzWyGme1kZp3N7FEzeyP6s1PC70KZlWxQXkXCkmBmS53XBhtkM1s9/GJb4Dkze83MpprZ82Y2tbkrFKl0NdGdfhqbYhoDPOTuA8kdSp1Bbnzh4+7eH3ichMYbKrOSRcqrSFgSzGxJ81psDPKzwHbAgc19cZHQrD78k8hrmW0A7AYcA+Duy4HlZnYQMDxa7GbgCeC8BFapzEqmKK8iYUkqs+XIa7EG2aKVvtmcFxYJk1Eb/9umLmY2Oe/xWHcfm/e4L7AA+JOZDQWmAKcD3dx9brTMByR3SSdlVjJGeRUJS2KZLXleizXIXc3sRw096e6/bO5KRSqV0aS7/Cx09x2KPN+C3DdEp7r7JDMbQ8HhHnd3M0vqxBxlVjJFeRUJS4KZLXleizXItUB7COSKziJJSPbs2dnAbHefFD2+m1yA55nZJu4+18w2AeYntD5lVrJFeRUJS3KZLXleizXIc939sua+sEiomnBCT1Hu/oGZvWdmA9z9NWAv4JVoOhq4MvrzvkRWqMxKBimvImFJIrPlyGujY5BFsqSJh3/iOBW41cxaAW8Bx5K7esydZnY8MAs4LKF1KbOSKcqrSFgSzmxJ81qsQd6ruS8qErLaBI/ZuvsLQH1jqEqRL2VWMkd5FQlLUpktdV4bbJDdfVESKxAJiRHv7jmVSJmVrFFeRcISUmaLfYMskj0Wzn3iRTJPeRUJS0CZVYMsUiCM6IoIKK8ioQkls2qQRfLk7vITSnxFsk15FQlLSJlVg5xn7pzZjD79BBYunI+ZcdioYznqe6dw3S9+yt23jaNT5y4AnHH+Jey+1z4pV5uOMccN4xvbdGfhJ1+w60UPAXDJd4ayzzY9WL5yFe/M/5RTb5rEJ5+tYPfB3fjxt4fSsraGFXWruGT8Czw1I6lLiJZOguf8SAktW/YFPzxyJMuXL6OubiV77HMgx58+msn//Q+/vfpiVq1aRdt263HhVdfTc9PN0i43NT/79hD22LIrH366nJG/fAaADdq25NpRQ+nRuS1zFn3O6be+wCefr2T9ti244ttb0WvDdixfUcfou6bxxrxPU34HxSmvYflsySeMv/p85r79OmAccf5VfLzgAx760xjmzZrJmTfcQ++BW6ddZsUYOXgj9h6Q6z1mLfqc6556hxV1zpHbd+drfTuxyp2HZizgwVcWpFxpfKFkVg1ynhYtWnDuxVcwaKttWPrpEg4dsSs77bYnAN894Yccd9LpKVeYvjuefpubHn+D60/4ypp5T0ybx+V3vUTdKufH3x7KGfsP4rK7XmTRkmWMuvZJPlj8BQN7bMBdZ+/OVmfen2L1cVgw46OyrlWr1oy55V7ardeelStWcPIR+/KV3ffm55eczZW//Qt9+g3gb7fexM2//QUXXnV92uWm5m+T5/CX/77L1d/Zas28E/foy4SZHzL2ibc5cXhfThy+GT//5+uctOfmzHj/E0655Xk267oeFx88iKP/8FyK1TdGeQ3NPb++jIFf2Z1jL/8tK1csZ/kXX9C2/foc+5PfcefPL0y7vIrSuV1L9h+8Eaf/dTrL65yz9ujLLpt1xoAu67Xi1Lun48AGbUJq5cLJbCgnE5ZF124bM2irbQBYr30HNus/gPkfzG3kt7JlwusL+Gjp8rXmPTH9A+pW5e7mOPnNhXTv3BaAl99dzAeLvwDg1Tkf06ZlLa1aVPZfudVn2MaZJF1mRrv12gOwcuUK6lauxCz3j+/SpUsAWLrkE7pstHGaZaZu8tsf8fFnK9aat9fgbtwz5X0A7pnyPnsP6QZAv43WY+LM3MUV3lqwlB6d27Jh+1blLbgJlNewfP7pJ7z54rN8df/cpWlbtGxFuw7rs3GffnTrnd2jPMXUmtGqtoYag9Ytalj02XL22bIrdz4/l9X3UP74i5Wp1tgUIWU2pN2Osprz3ixmTHuRrbfdganPTeC2P93A/XffxuCtt+PcH/+MDTp2SrvEijRqt824d9K7X5p/wA49eWnWRyxfuSqFqpomlL1bgbq6Oo4/ZA/mvPs2h4w6nsFDd+D8n4zhnBO+Q+vWbVivfQduuOuRtMusOF3at2LBkmUALFiyjC5RE/zq3CV8fatuTH7nI7butQHdO7Zh4w3a8OGny4u9XKqU13B8OHc27Tt25rYrzuX9N2fQa4shHHLaj2ndtl3apVWkRZ+t4L5p87jh8K1YvnIVL875hBfnLOFHw1uz82ad+MqmHfnki5XcNPE95n6yLO1yYwslsyVr0s3sj2Y238ymlWodpbJ06aecfsIoRl96Fe07rM/h3/0eD//3Zf72yAS6btSNqy+7IO0SK9KZBwxiZZ1z14RZa80f0H19fnzYNpw1bnJKlTWNxZyqTYiZra2tZdz9T/K3J6cx46WpvPX6K4wf9zuu+cN47nlqOvt960h+87OL0i6z4nn0VdQN/36L9du04L4zvsZRX+vNjPeXsGqVF//llCmv4eR1Vd1KZr8xnZ0PHsU5N/2dVm3a8fitv0+7rIq1XqtahvXegJPvnMb3bn+J1i1r2W3zzrSoNVbUreLc+1/l0dcWcsqum6ZdapOEktlSfos9DhhRwtcviRUrVnDGCaMYech3+Pp+BwHQpWs3amtrqamp4dujjuXlF8Jo9Mrp8F368o2h3Tnphglrzd+kU1tuOW0XThk7kXcWVPbJPsCaazTGmarQOALMLECH9Tdgu6/swsQnH2Pmq9PCsiXjAAAPqUlEQVQYPDR3c6U99/sm055/NuXqKs/CT5fTtUNrALp2aM2H0bCppctyJ+YddO1/OWf8y3RarxXvLvoszVKLU16DymvHrpuwQdeN6TMoN5Rx6PARzH49mP6+7Lbu3oF5S5bzyRcrqXOY9M5HDOy2Hh8uXcHEdxYDMGnWYjbtHNA38AFltmQNsrs/CQR1pyB35/+d9QM26zeAY75/6pr5C+Z9sObnx/75AP0HDEqjvIq151Ybc+q+A/m/MU/x+fK6NfPXb9eS28/cjcvueolnZy5MscL4jNyYrzhTtQktsx8tWsiSTz4GYNkXn/PcM0+w6eYDWLrkE959eyYAk5/5N5tuvkWaZVakf70yn0O27w7AIdt35/Hp8wDo0KYFLWtzf7cPG9aTyW8vYumyugZfJ23Kazh5BVh/w6502mgT5r37FgCvT/kv3fr0T7mqyrVw6XK22Gg9WkWZ3Kr7+sxe/AXPzlrMkE06ADB44/bM/fiLNMtskpAym/oYZDM7ETgRYJMevVKtZepzE7j/r7ezxZaDOeTrOwG5S7o9eO9dvPrKS5gZPXpuyiVX/TrVOtM09qSd2HngRnRu35qXfnkgV907jdP335LWLWq5+5zhAEx580POvnky39urP327deDsgwZz9kGDAfj2NU+wcEllj5VKP5aVKz+v3br3TLWWD+fP46fn/YBVq+pYtWoVe+57MDvvsQ/n/uRaLjr1aMxq6LBBR0b/7Dep1pm2Xx45lGGbdaLTeq148oLh/PrRNxj777cYM2obDh3Wk/c/+pzT//IiAJtv1J6rvrMVDsz8YAkX3F353+4prw3Lz2unbt1Tribnm6dfwl8uP4OVK1awYffeHDn6al568mH+OuZSPl28iLHnHU+PfoM4+Rc3p11q6t5Y8BkT3v6Inx88iFXuvPXhZzzy6kJatajhzOF9OWBIN75YWcdvn57V+ItVkFAya+6lG19mZn2Av7v7kDjLDxm6nd/1z6dKVk+12fWCB9IuIRiL/34BKxe+1Wgu+w0e6r+44+FYr3nw1ptMcfcd1rm4CtKUzA7calu/6W//KnlN1eLYP0xKu4SgvHHNvo3mS3m1PsTMa++BW/lZf6j0y2xWjv+8HtSX86m753s7xMpXSJlN/RtkkUqSuwRNKPu3ItmmvIqEJaTMqkEWKVABQ59EJCblVSQsoWS2lJd5ux2YAAwws9lmdnyp1iWSHKPG4k3VRpmV8CivKK8SlHAyW7JvkN39iFK9tkiphHT4J2nKrIRGeRUJS0iZ1RALkXwWzuEfkcxTXkXCElBm1SCLFAglvCKivIqEJpTMqkEWKWCBHP4REeVVJDShZLaUt5oWCY4BNRZvivV6ZrVm9ryZ/T163NfMJpnZTDMbb2atSvh2RKpa0nkFZVaklELaxqpBFimQ8Bm2pwMz8h5fBfzK3fsBHwE681xkHZTgjHhlVqSEQtnGqkEWKWAx/2v0dcx6AvsDN0aPDdgTuDta5Gbg4BK9DZFMSCqvoMyKlEMo21iNQRbJs/rwT0xdzGxy3uOx7j427/G1wLlAh+jxhsBid18ZPZ4N9Gh+tSLZlnBeQZkVKamQtrFqkEXWEv/bJmBhQ/eJN7ORwHx3n2Jmw5OqTkTyJZNXUGZFyiOcbawaZJF8yV2jcWfgQDPbD2gDrA+MATqaWYtoD7cnMCeRtYlkUbLXVFVmRUotoG2sxiCL5DGg1izWVIy7j3b3nu7eBzgc+Je7jwL+DRwaLXY0cF8J345IVUsqr6DMipRDSNtYNcgiBSzm1EznAT8ys5nkxkvdtG7VimRbifMKyqxIokLZxmqIhUihhK9h7u5PAE9EP78FDEt2DSIZVoJ7DiizIiUUyDZWDbJIgVDu8iMiyqtIaELJrBpkkQKh3CdeRJRXkdCEklk1yCIFQgmviCivIqEJJbNqkEXy5E4OCCS9IhmnvIqEJaTMqkEWyZfsdVVFpJSUV5GwBJRZNcgiBQLJroigvIqEJpTMqkEWKRRKekVEeRUJTSCZVYMsspYm3SdeRFKlvIqEJZzMqkEWyWNATRjZFck85VUkLCFlVg2ySKFAwisiKK8ioQkks2qQRQqEcvhHRJRXkdCEklk1yCIFQrkEjYgoryKhCSWzapBFCgSSXRFBeRUJTSiZVYMsks/AQtm9Fck65VUkLAFlVg2ySB4jnMM/IlmnvIqEJaTMqkEWKRBIdkUE5VUkNKFkVg2ySKFQ0isiyqtIaALJrBpkkQKhXIJGRJRXkdCEklk1yCIFQhkfJSLKq0hoQsmsGmSRAqGEV0SUV5HQhJLZimqQp7/0/MJBPdrPSruOenQBFqZdREAq8fPaNM5CRnKHf8ysF3AL0A1wYKy7jzGzzsB4oA/wDnCYu3+UyErL6LVpLyzcZYvOymv4KvXzajSzymt87702beEZu22mvIavUj+vsm5jy5HXimqQ3b1r2jXUx8wmu/sOadcRiqA/L0t073YlcJa7TzWzDsAUM3sUOAZ43N2vNLPzgfOB8xJba5kor9Uh6M9LeY1Nea0OwX9eyWW25HmtSaRMkSpiMafGuPtcd58a/bwEmAH0AA4Cbo4Wuxk4OMn6RbJEeRUJSxKZLUdeK+obZJGKEH/vtouZTc57PNbdx9b7kmZ9gG2BSUA3d58bPfUBuUNEItIcyqtIWBLObKnyqgY5nnr/EZUGBfx5GTXxj/8sjHOoy8zaA38FznD3T/Jvs+nubmberFKlIQH//UtFwJ+X8loFAv77l4rAP69kM1vKvGqIRQwNfcsg9Qv584p76CduvM2sJbnw3uruf4tmzzOzTaLnNwHmJ/YGJOi/f2kI+fNSXsMX8t+/NIT+eSWZ2VLnVQ2ySKGE0mu5XdmbgBnu/su8p+4Hjo5+Phq4L6HKRbJHeRUJSwKZLUdeNcRCpECCd/nZGTgKeNnMXojmXQBcCdxpZscDs4DDklqhSNYoryJhSSizJc+rGuQizGwEMAaoBW509ytTLqlimdkfgZHAfHcfknY96yKpy0a5+9M0vB+8VzJrkdWU16aplswqr+FSZuOrlrxCMpktR141xKIBZlYLXA/sCwwCjjCzQelWVdHGASPSLiIJSY5plPJQXptlHFWQWeU1TMpsk42jCvIK4WRWDXLDhgEz3f0td18O3EHu+npSD3d/EliUdh3rzMDMYk1SUZTXJqqKzCqvIVNmm6Aq8gpBZVYNcsN6AO/lPZ4dzZMqZuQO/8SZpKIorxmkvAZNmc2gkDKrMcgiBSoglyISk/IqEpZQMqsGuWFzgF55j3tG86TKVcKeqzSZ8ppRymuwlNmMCiWzGmLRsOeA/mbW18xaAYeTu76eVDmL+Z9UFOU1o5TXYCmzGRVKZtUgN8D9/7d3t6GWTXEcx7+/O0wzZm5GCXmoy4yHELe5BlEa4ubZJF5IaSLMaESiFIpS1LyTZDwlycN4mBKjIS8w0wwzc82jeTTCSJEXEiPh78VeN9vJ3LvPvee4Z+3z+9Spc/ZZZ6217+13ztpnr7NX/AEsAlYA24ClEbF1YnvVuSS9DKwGTpS0N12DMEu5zI+yfzivzatLZp3XPDmzzalLXiGfzHqKxQgiYjmwfKL7kYOIuG6i+9AKnRJMa57z2pw6ZNZ5zZszW10d8gp5ZdYDZLMGnXBqx8yqcV7N8pJLZj1ANmuUR3bNDJxXs9xkklkPkM0aZJJdM8N5NctNLpn1ANnsX0RPLhOkzLqe82qWl3wy6wGyWcnwKj9m1vmcV7O85JRZX+atIkl/StogaYuk1yQdNI665kp6O92/UtK9I5SdIem2MbTxoKS7q25vKPO8pGuaaKtP0pZm+2jWTs7siOWdWesozuuI5Z3XCeABcnX7IqI/Ik4FfgcWlJ9Uoem/Z0S8FRGPjlBkBtB0eG3scrlGo43Kme0CzmttOK9dIpfMeoA8Nh8Ds9JR3Q5JLwBbgGMkDUpaLWkoHQVPB5B0saTtkoaAq4crkjRf0uPp/uGSlknamG7nAI8CM9OR9eJU7h5JayVtkvRQqa77JO2UtBI4cbSdkHRzqmejpDcajtgvlLQu1Xd5Kj9J0uJS27eO9w/ZiXJZ5cea4szWNLPOay05rzXNK+STWQ+QmyTpAOASYHPadDzwREScAvwC3A9cGBGzgXXAXZKmAE8DVwADwBH7qf4x4MOIOB2YDWwF7gW+SEfW90gaTG2eCfQDA5LOkzRAsVRnP3ApMKfC7rwZEXNSe9uA8so8famNy4An0z7cBPwUEXNS/TdLOrZCO/moeGTbCUe3Vo0zW+PMOq+147zWOK+QVWb9I73qpkrakO5/DDwLHAl8FRFr0vazgZOBVSr+u5MploY8CfgyInYBSHoRuOU/2rgAuAEgIv4EfpJ0SEOZwXT7LD2eThHmXmBZRPya2qiypv2pkh6mOMU0nWLJz2FLI+IvYJekPWkfBoHT9M/cqYNT2zsrtJWFnH5AYKNyZmueWee1VpzXmucV8sqsB8jV7YuI/vKGFNBfypuA9xuXhJT0r9eNk4BHImJJQxt3jqGu54F5EbFR0nxgbum5aCgbqe3bI6IcciT1jaHtjtUJp3asJZzZLsis81obzmsX5BXyyaynWLTWGuBcSbMAJE2TdAKwHeiTNDOV29+a6h8AC9NrJ0k6GPiZ4sh12ArgxtK8q6MkHQZ8BMyTNFVSL8WpptH0At9JOhC4vuG5ayX1pD4fB+xIbS9M5ZF0gqRpFdrJSi6nf6wlnNnMOa9dxXmtgVwy6wFyC0XED8B84GVJm0infiLiN4rTPe+o+AHB9/up4g7gfEmbgfXAyRHxI8XppC2SFkfEe8BLwOpU7nWgNyKGgFeBjcC7wNoKXX4A+ARYRfEGU/Y18Gmqa0Hah2eAz4EhFZecWUINz0Ko4m3UeoofjeyQtFsjXGbIJo4zm79W5RWc2U7nvNZDLp+ximj8lt+se80eOCNWrqnyvgfTJvesj4gz/us5SZMo5o1dBOyleDO9LiI+b1Vfzbpdq/IKzqzZ/yGnz1h/g2xWIqBHqnQbxZnA7ojYExG/A68AV7W7/2bdpIV5BWfWrO1y+oyt3Vf3ZuMxNLR+xdQDdWjF4lMkrSs9fioinkr3jwK+KT23FzirFX00s0IL8wrOrFnb5fQZ6wGyWUlEXDzRfTCzapxXs7zklFlPsTBrj2+BY0qPj07bzKwzObNm+Wh7Xj1ANmuPtcDxko6VNJliBaYqF5Y3s4nhzJrlo+159RQLszaIiD8kLaK4ruUk4LmI2DrB3TKz/XBmzfLxf+TVl3kzMzMzMyvxFAszMzMzsxIPkM3MzMzMSjxANjMzMzMr8QDZzMzMzKzEA2QzMzMzsxIPkM3MzMzMSjxANjMzMzMr+RsuYDYGFXdzoQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 720x720 with 18 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "lr = LogisticRegression(C = 0.01, penalty = 'l1')\n",
    "lr.fit(X_train_undersample,y_train_undersample.values.ravel())\n",
    "y_pred_undersample_proba = lr.predict_proba(X_test_undersample.values)\n",
    "\n",
    "thresholds = [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9]\n",
    "\n",
    "plt.figure(figsize=(10,10))\n",
    "\n",
    "j = 1\n",
    "for i in thresholds:\n",
    "    y_test_predictions_high_recall = y_pred_undersample_proba[:,1] > i\n",
    "    \n",
    "    plt.subplot(3,3,j)\n",
    "    j += 1\n",
    "    \n",
    "    # Compute confusion matrix\n",
    "    cnf_matrix = confusion_matrix(y_test_undersample,y_test_predictions_high_recall)\n",
    "    np.set_printoptions(precision=2)\n",
    "\n",
    "    print \"Recall metric in the testing dataset for threshold {}: {}\".format(i, cnf_matrix[1,1]/(cnf_matrix[1,0]+cnf_matrix[1,1]))\n",
    "\n",
    "    # Plot non-normalized confusion matrix\n",
    "    class_names = [0,1]\n",
    "    plot_confusion_matrix(cnf_matrix\n",
    "                          , classes=class_names\n",
    "                          , title='Threshold >= %s'%i) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "cdf08467-7947-a71b-3d00-7b060905bbdb"
   },
   "source": [
    "### The pattern is very clear: the more you lower the required probability to put a certain in the class \"1\" category, more records will be put in that bucket.\n",
    "#### This implies an increase in recall (we want all the \"1\"s), but at the same time, a decrease in precision (we misclassify many of the other class).\n",
    "### Therefore, even though recall is our goal metric (do not miss a fraud transaction), we also want to keep the model being accurate as a whole.\n",
    "- There is an option I think could be quite interesting to tackle this. We could assing cost to misclassifications, but being interested in classifying \"1s\" correctly, the cost for misclassifying \"1s\" should be bigger than \"0\" misclassifications. After that, the algorithm would select the threshold which minimises the total cost. A drawback I see is that we have to manually select the weight of each cost... therefore, I will leave this know as a thought.\n",
    "- Going back to the threshold changing, there is an option which is the Precisio-Recall curve. By visually seeing the performance of the model depending on the threshold we choose, we can investigate a sweet spot where recall is high enough whilst keeping a high precision value.\n",
    "\n",
    "### Investigate Precision-Recall curve and area under this curve."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-04T00:45:11.062019Z",
     "start_time": "2018-11-04T00:45:10.675087Z"
    },
    "_cell_guid": "c73b727b-6743-add2-a45f-a83ce5b8b375"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from itertools import cycle\n",
    "\n",
    "lr = LogisticRegression(C = 0.01, penalty = 'l1')\n",
    "lr.fit(X_train_undersample,y_train_undersample.values.ravel())\n",
    "y_pred_undersample_proba = lr.predict_proba(X_test_undersample.values)\n",
    "\n",
    "thresholds = [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9]\n",
    "colors = cycle(['navy', 'turquoise', 'darkorange', 'cornflowerblue', 'teal', 'red', 'yellow', 'green', 'blue','black'])\n",
    "\n",
    "plt.figure(figsize=(5,5))\n",
    "\n",
    "j = 1\n",
    "for i,color in zip(thresholds,colors):\n",
    "    y_test_predictions_prob = y_pred_undersample_proba[:,1] > i\n",
    "    \n",
    "    precision, recall, thresholds = precision_recall_curve(y_test_undersample,y_test_predictions_prob)\n",
    "    \n",
    "    # Plot Precision-Recall curve\n",
    "    plt.plot(recall, precision, color=color,\n",
    "                 label='Threshold: %s'%i)\n",
    "    plt.xlabel('Recall')\n",
    "    plt.ylabel('Precision')\n",
    "    plt.ylim([0.0, 1.05])\n",
    "    plt.xlim([0.0, 1.0])\n",
    "    plt.title('Precision-Recall example')\n",
    "    plt.legend(loc=\"lower left\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-03T16:08:08.659111Z",
     "start_time": "2018-11-03T16:08:08.654030Z"
    },
    "collapsed": true
   },
   "source": [
    "### Deep Learning Time"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-04T00:45:12.917194Z",
     "start_time": "2018-11-04T00:45:12.911427Z"
    }
   },
   "outputs": [],
   "source": [
    "from keras.models import Sequential\n",
    "from keras.layers import Dense\n",
    "from keras.wrappers.scikit_learn import KerasClassifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-04T00:48:28.269690Z",
     "start_time": "2018-11-04T00:48:28.258451Z"
    }
   },
   "outputs": [],
   "source": [
    "# change our function to have multiple hidden layers in our network\n",
    "def network_builder(hidden_dimensions, input_dim):\n",
    "    # create model\n",
    "    model = Sequential()\n",
    "    model.add(Dense(hidden_dimensions[0], input_dim=input_dim, kernel_initializer='normal', activation='relu'))\n",
    "    # add multiple hidden layers\n",
    "    for dimension in hidden_dimensions[1:]:\n",
    "        model.add(Dense(dimension, kernel_initializer='normal', activation='relu'))\n",
    "    model.add(Dense(1, kernel_initializer='normal', activation='sigmoid'))\n",
    "    # Compile model. We use the the logarithmic loss function, and the Adam gradient optimizer.\n",
    "    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])\n",
    "    return model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-04T00:51:37.352752Z",
     "start_time": "2018-11-04T00:51:37.339085Z"
    }
   },
   "outputs": [],
   "source": [
    "# Find the best hyper-parameter optimizing for recall\n",
    "def print_gridsearch_scores_deep_learning(x_train_data,y_train_data):\n",
    "    c_param_range = [0.01,0.1,1,10,100]\n",
    "\n",
    "    clf = GridSearchCV(KerasClassifier(build_fn=network_builder, epochs=50, batch_size=128, \n",
    "                                       verbose=1, input_dim=29), \n",
    "                       {\"hidden_dimensions\": ([10], [10, 10, 10], [100, 10])}, cv=5, scoring='recall')\n",
    "    clf.fit(x_train_data,y_train_data)\n",
    "\n",
    "    print \"Best parameters set found on development set:\"\n",
    "    print\n",
    "    print clf.best_params_\n",
    "\n",
    "    print \"Grid scores on development set:\"\n",
    "    means = clf.cv_results_['mean_test_score']\n",
    "    stds = clf.cv_results_['std_test_score']\n",
    "    for mean, std, params in zip(means, stds, clf.cv_results_['params']):\n",
    "        print \"%0.3f (+/-%0.03f) for %r\" % (mean, std * 2, params)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-04T00:52:47.335583Z",
     "start_time": "2018-11-04T00:51:37.738605Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/50\n",
      "550/550 [==============================] - 2s 3ms/step - loss: 0.7176 - acc: 0.2673\n",
      "Epoch 2/50\n",
      "550/550 [==============================] - 0s 25us/step - loss: 0.6955 - acc: 0.4582\n",
      "Epoch 3/50\n",
      "550/550 [==============================] - 0s 41us/step - loss: 0.6734 - acc: 0.6327\n",
      "Epoch 4/50\n",
      "550/550 [==============================] - 0s 36us/step - loss: 0.6497 - acc: 0.6491\n",
      "Epoch 5/50\n",
      "550/550 [==============================] - 0s 43us/step - loss: 0.6244 - acc: 0.6655\n",
      "Epoch 6/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.5967 - acc: 0.6800\n",
      "Epoch 7/50\n",
      "550/550 [==============================] - 0s 36us/step - loss: 0.5675 - acc: 0.7018\n",
      "Epoch 8/50\n",
      "550/550 [==============================] - 0s 39us/step - loss: 0.5404 - acc: 0.7164\n",
      "Epoch 9/50\n",
      "550/550 [==============================] - 0s 30us/step - loss: 0.5172 - acc: 0.7327\n",
      "Epoch 10/50\n",
      "550/550 [==============================] - 0s 41us/step - loss: 0.4971 - acc: 0.7673\n",
      "Epoch 11/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.4808 - acc: 0.7891\n",
      "Epoch 12/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.4673 - acc: 0.8073\n",
      "Epoch 13/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.4562 - acc: 0.8273\n",
      "Epoch 14/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.4465 - acc: 0.8364\n",
      "Epoch 15/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.4381 - acc: 0.8527\n",
      "Epoch 16/50\n",
      "550/550 [==============================] - 0s 24us/step - loss: 0.4305 - acc: 0.8709\n",
      "Epoch 17/50\n",
      "550/550 [==============================] - 0s 37us/step - loss: 0.4238 - acc: 0.8964\n",
      "Epoch 18/50\n",
      "550/550 [==============================] - 0s 24us/step - loss: 0.4175 - acc: 0.9091\n",
      "Epoch 19/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.4117 - acc: 0.9091\n",
      "Epoch 20/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.4062 - acc: 0.9164\n",
      "Epoch 21/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.4010 - acc: 0.9218\n",
      "Epoch 22/50\n",
      "550/550 [==============================] - 0s 36us/step - loss: 0.3961 - acc: 0.9291\n",
      "Epoch 23/50\n",
      "550/550 [==============================] - 0s 23us/step - loss: 0.3912 - acc: 0.9291\n",
      "Epoch 24/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.3865 - acc: 0.9309\n",
      "Epoch 25/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.3821 - acc: 0.9345\n",
      "Epoch 26/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.3777 - acc: 0.9400\n",
      "Epoch 27/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.3733 - acc: 0.9400\n",
      "Epoch 28/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.3692 - acc: 0.9400\n",
      "Epoch 29/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.3649 - acc: 0.9400\n",
      "Epoch 30/50\n",
      "550/550 [==============================] - 0s 39us/step - loss: 0.3609 - acc: 0.9364\n",
      "Epoch 31/50\n",
      "550/550 [==============================] - 0s 38us/step - loss: 0.3569 - acc: 0.9364\n",
      "Epoch 32/50\n",
      "550/550 [==============================] - 0s 25us/step - loss: 0.3528 - acc: 0.9400\n",
      "Epoch 33/50\n",
      "550/550 [==============================] - 0s 39us/step - loss: 0.3489 - acc: 0.9418\n",
      "Epoch 34/50\n",
      "550/550 [==============================] - 0s 27us/step - loss: 0.3449 - acc: 0.9436\n",
      "Epoch 35/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.3410 - acc: 0.9418\n",
      "Epoch 36/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.3370 - acc: 0.9436\n",
      "Epoch 37/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.3331 - acc: 0.9436\n",
      "Epoch 38/50\n",
      "550/550 [==============================] - 0s 30us/step - loss: 0.3293 - acc: 0.9455\n",
      "Epoch 39/50\n",
      "550/550 [==============================] - 0s 26us/step - loss: 0.3254 - acc: 0.9455\n",
      "Epoch 40/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.3216 - acc: 0.9455\n",
      "Epoch 41/50\n",
      "550/550 [==============================] - 0s 23us/step - loss: 0.3177 - acc: 0.9455\n",
      "Epoch 42/50\n",
      "550/550 [==============================] - 0s 27us/step - loss: 0.3139 - acc: 0.9455\n",
      "Epoch 43/50\n",
      "550/550 [==============================] - 0s 24us/step - loss: 0.3101 - acc: 0.9455\n",
      "Epoch 44/50\n",
      "550/550 [==============================] - 0s 27us/step - loss: 0.3062 - acc: 0.9473\n",
      "Epoch 45/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.3025 - acc: 0.9473\n",
      "Epoch 46/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.2987 - acc: 0.9473\n",
      "Epoch 47/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.2947 - acc: 0.9473\n",
      "Epoch 48/50\n",
      "550/550 [==============================] - 0s 26us/step - loss: 0.2910 - acc: 0.9473\n",
      "Epoch 49/50\n",
      "550/550 [==============================] - 0s 36us/step - loss: 0.2872 - acc: 0.9455\n",
      "Epoch 50/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.2835 - acc: 0.9455\n",
      "138/138 [==============================] - 1s 4ms/step\n",
      "550/550 [==============================] - 0s 12us/step\n",
      "Epoch 1/50\n",
      "550/550 [==============================] - 2s 4ms/step - loss: 0.6973 - acc: 0.3855\n",
      "Epoch 2/50\n",
      "550/550 [==============================] - 0s 27us/step - loss: 0.6762 - acc: 0.6855\n",
      "Epoch 3/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.6579 - acc: 0.7182\n",
      "Epoch 4/50\n",
      "550/550 [==============================] - 0s 45us/step - loss: 0.6392 - acc: 0.7473\n",
      "Epoch 5/50\n",
      "550/550 [==============================] - 0s 38us/step - loss: 0.6209 - acc: 0.7818\n",
      "Epoch 6/50\n",
      "550/550 [==============================] - 0s 27us/step - loss: 0.6014 - acc: 0.8127\n",
      "Epoch 7/50\n",
      "550/550 [==============================] - 0s 46us/step - loss: 0.5813 - acc: 0.8327\n",
      "Epoch 8/50\n",
      "550/550 [==============================] - 0s 37us/step - loss: 0.5611 - acc: 0.8636\n",
      "Epoch 9/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.5409 - acc: 0.8691\n",
      "Epoch 10/50\n",
      "550/550 [==============================] - 0s 38us/step - loss: 0.5219 - acc: 0.8836\n",
      "Epoch 11/50\n",
      "550/550 [==============================] - 0s 52us/step - loss: 0.5047 - acc: 0.8873\n",
      "Epoch 12/50\n",
      "550/550 [==============================] - 0s 40us/step - loss: 0.4891 - acc: 0.8982\n",
      "Epoch 13/50\n",
      "550/550 [==============================] - 0s 46us/step - loss: 0.4748 - acc: 0.9055\n",
      "Epoch 14/50\n",
      "550/550 [==============================] - 0s 53us/step - loss: 0.4615 - acc: 0.9036\n",
      "Epoch 15/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.4493 - acc: 0.9091\n",
      "Epoch 16/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.4382 - acc: 0.9145\n",
      "Epoch 17/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.4277 - acc: 0.9236\n",
      "Epoch 18/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.4182 - acc: 0.9273\n",
      "Epoch 19/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.4090 - acc: 0.9291\n",
      "Epoch 20/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.4007 - acc: 0.9291\n",
      "Epoch 21/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.3926 - acc: 0.9309\n",
      "Epoch 22/50\n",
      "550/550 [==============================] - 0s 37us/step - loss: 0.3851 - acc: 0.9309\n",
      "Epoch 23/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.3780 - acc: 0.9309\n",
      "Epoch 24/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.3710 - acc: 0.9309\n",
      "Epoch 25/50\n",
      "550/550 [==============================] - 0s 30us/step - loss: 0.3643 - acc: 0.9345\n",
      "Epoch 26/50\n",
      "550/550 [==============================] - 0s 37us/step - loss: 0.3577 - acc: 0.9327\n",
      "Epoch 27/50\n",
      "550/550 [==============================] - 0s 30us/step - loss: 0.3514 - acc: 0.9327\n",
      "Epoch 28/50\n",
      "550/550 [==============================] - 0s 38us/step - loss: 0.3452 - acc: 0.9345\n",
      "Epoch 29/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.3391 - acc: 0.9382\n",
      "Epoch 30/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.3332 - acc: 0.9382\n",
      "Epoch 31/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.3274 - acc: 0.9382\n",
      "Epoch 32/50\n",
      "550/550 [==============================] - 0s 38us/step - loss: 0.3216 - acc: 0.9400\n",
      "Epoch 33/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.3159 - acc: 0.9400\n",
      "Epoch 34/50\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "550/550 [==============================] - 0s 33us/step - loss: 0.3103 - acc: 0.9382\n",
      "Epoch 35/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.3049 - acc: 0.9382\n",
      "Epoch 36/50\n",
      "550/550 [==============================] - 0s 24us/step - loss: 0.2995 - acc: 0.9364\n",
      "Epoch 37/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.2942 - acc: 0.9382\n",
      "Epoch 38/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.2889 - acc: 0.9400\n",
      "Epoch 39/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.2838 - acc: 0.9400\n",
      "Epoch 40/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.2789 - acc: 0.9400\n",
      "Epoch 41/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.2738 - acc: 0.9382\n",
      "Epoch 42/50\n",
      "550/550 [==============================] - 0s 43us/step - loss: 0.2690 - acc: 0.9382\n",
      "Epoch 43/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.2644 - acc: 0.9382\n",
      "Epoch 44/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.2596 - acc: 0.9400\n",
      "Epoch 45/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.2552 - acc: 0.9418\n",
      "Epoch 46/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.2508 - acc: 0.9418\n",
      "Epoch 47/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.2463 - acc: 0.9418\n",
      "Epoch 48/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.2420 - acc: 0.9418\n",
      "Epoch 49/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.2379 - acc: 0.9418\n",
      "Epoch 50/50\n",
      "550/550 [==============================] - 0s 30us/step - loss: 0.2338 - acc: 0.9418\n",
      "138/138 [==============================] - 1s 5ms/step\n",
      "550/550 [==============================] - 0s 13us/step\n",
      "Epoch 1/50\n",
      "550/550 [==============================] - 2s 3ms/step - loss: 0.6699 - acc: 0.6364\n",
      "Epoch 2/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.6510 - acc: 0.6618\n",
      "Epoch 3/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.6281 - acc: 0.6964\n",
      "Epoch 4/50\n",
      "550/550 [==============================] - 0s 38us/step - loss: 0.6013 - acc: 0.7200\n",
      "Epoch 5/50\n",
      "550/550 [==============================] - 0s 43us/step - loss: 0.5735 - acc: 0.7436\n",
      "Epoch 6/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.5474 - acc: 0.7691\n",
      "Epoch 7/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.5230 - acc: 0.7818\n",
      "Epoch 8/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.5017 - acc: 0.7927\n",
      "Epoch 9/50\n",
      "550/550 [==============================] - 0s 26us/step - loss: 0.4830 - acc: 0.8145\n",
      "Epoch 10/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.4672 - acc: 0.8291\n",
      "Epoch 11/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.4533 - acc: 0.8491\n",
      "Epoch 12/50\n",
      "550/550 [==============================] - 0s 25us/step - loss: 0.4407 - acc: 0.8618\n",
      "Epoch 13/50\n",
      "550/550 [==============================] - 0s 38us/step - loss: 0.4296 - acc: 0.8691\n",
      "Epoch 14/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.4192 - acc: 0.8800\n",
      "Epoch 15/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.4098 - acc: 0.8873\n",
      "Epoch 16/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.4015 - acc: 0.8945\n",
      "Epoch 17/50\n",
      "550/550 [==============================] - 0s 26us/step - loss: 0.3933 - acc: 0.9036\n",
      "Epoch 18/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.3859 - acc: 0.9073\n",
      "Epoch 19/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.3788 - acc: 0.9145\n",
      "Epoch 20/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.3724 - acc: 0.9145\n",
      "Epoch 21/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.3661 - acc: 0.9127\n",
      "Epoch 22/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.3600 - acc: 0.9145\n",
      "Epoch 23/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.3542 - acc: 0.9182\n",
      "Epoch 24/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.3488 - acc: 0.9200\n",
      "Epoch 25/50\n",
      "550/550 [==============================] - 0s 30us/step - loss: 0.3433 - acc: 0.9218\n",
      "Epoch 26/50\n",
      "550/550 [==============================] - 0s 36us/step - loss: 0.3380 - acc: 0.9236\n",
      "Epoch 27/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.3329 - acc: 0.9273\n",
      "Epoch 28/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.3279 - acc: 0.9345\n",
      "Epoch 29/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.3230 - acc: 0.9364\n",
      "Epoch 30/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.3183 - acc: 0.9382\n",
      "Epoch 31/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.3136 - acc: 0.9364\n",
      "Epoch 32/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.3090 - acc: 0.9364\n",
      "Epoch 33/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.3044 - acc: 0.9364\n",
      "Epoch 34/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.3002 - acc: 0.9364\n",
      "Epoch 35/50\n",
      "550/550 [==============================] - 0s 44us/step - loss: 0.2958 - acc: 0.9364\n",
      "Epoch 36/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.2916 - acc: 0.9382\n",
      "Epoch 37/50\n",
      "550/550 [==============================] - 0s 24us/step - loss: 0.2873 - acc: 0.9382\n",
      "Epoch 38/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.2833 - acc: 0.9382\n",
      "Epoch 39/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.2792 - acc: 0.9382\n",
      "Epoch 40/50\n",
      "550/550 [==============================] - 0s 26us/step - loss: 0.2751 - acc: 0.9400\n",
      "Epoch 41/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.2711 - acc: 0.9418\n",
      "Epoch 42/50\n",
      "550/550 [==============================] - 0s 27us/step - loss: 0.2673 - acc: 0.9455\n",
      "Epoch 43/50\n",
      "550/550 [==============================] - 0s 36us/step - loss: 0.2633 - acc: 0.9473\n",
      "Epoch 44/50\n",
      "550/550 [==============================] - 0s 25us/step - loss: 0.2596 - acc: 0.9473\n",
      "Epoch 45/50\n",
      "550/550 [==============================] - 0s 30us/step - loss: 0.2559 - acc: 0.9473\n",
      "Epoch 46/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.2522 - acc: 0.9473\n",
      "Epoch 47/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.2487 - acc: 0.9473\n",
      "Epoch 48/50\n",
      "550/550 [==============================] - 0s 27us/step - loss: 0.2453 - acc: 0.9473\n",
      "Epoch 49/50\n",
      "550/550 [==============================] - 0s 27us/step - loss: 0.2419 - acc: 0.9473\n",
      "Epoch 50/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.2386 - acc: 0.9473\n",
      "138/138 [==============================] - 1s 5ms/step\n",
      "550/550 [==============================] - 0s 16us/step\n",
      "Epoch 1/50\n",
      "551/551 [==============================] - 2s 3ms/step - loss: 0.6602 - acc: 0.5463\n",
      "Epoch 2/50\n",
      "551/551 [==============================] - 0s 28us/step - loss: 0.6393 - acc: 0.5898\n",
      "Epoch 3/50\n",
      "551/551 [==============================] - 0s 40us/step - loss: 0.6163 - acc: 0.6425\n",
      "Epoch 4/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.5941 - acc: 0.6715\n",
      "Epoch 5/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.5712 - acc: 0.6915\n",
      "Epoch 6/50\n",
      "551/551 [==============================] - 0s 42us/step - loss: 0.5490 - acc: 0.7205\n",
      "Epoch 7/50\n",
      "551/551 [==============================] - 0s 24us/step - loss: 0.5284 - acc: 0.7387\n",
      "Epoch 8/50\n",
      "551/551 [==============================] - 0s 28us/step - loss: 0.5099 - acc: 0.7641\n",
      "Epoch 9/50\n",
      "551/551 [==============================] - 0s 27us/step - loss: 0.4934 - acc: 0.7804\n",
      "Epoch 10/50\n",
      "551/551 [==============================] - 0s 28us/step - loss: 0.4792 - acc: 0.8022\n",
      "Epoch 11/50\n",
      "551/551 [==============================] - 0s 27us/step - loss: 0.4668 - acc: 0.8167\n",
      "Epoch 12/50\n",
      "551/551 [==============================] - 0s 26us/step - loss: 0.4558 - acc: 0.8312\n",
      "Epoch 13/50\n",
      "551/551 [==============================] - 0s 28us/step - loss: 0.4461 - acc: 0.8421\n",
      "Epoch 14/50\n",
      "551/551 [==============================] - 0s 30us/step - loss: 0.4377 - acc: 0.8621\n",
      "Epoch 15/50\n",
      "551/551 [==============================] - 0s 23us/step - loss: 0.4297 - acc: 0.8693\n",
      "Epoch 16/50\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "551/551 [==============================] - 0s 27us/step - loss: 0.4224 - acc: 0.8748\n",
      "Epoch 17/50\n",
      "551/551 [==============================] - 0s 31us/step - loss: 0.4155 - acc: 0.8947\n",
      "Epoch 18/50\n",
      "551/551 [==============================] - 0s 26us/step - loss: 0.4090 - acc: 0.9002\n",
      "Epoch 19/50\n",
      "551/551 [==============================] - 0s 24us/step - loss: 0.4029 - acc: 0.9038\n",
      "Epoch 20/50\n",
      "551/551 [==============================] - 0s 26us/step - loss: 0.3970 - acc: 0.9074\n",
      "Epoch 21/50\n",
      "551/551 [==============================] - 0s 42us/step - loss: 0.3913 - acc: 0.9147\n",
      "Epoch 22/50\n",
      "551/551 [==============================] - 0s 32us/step - loss: 0.3857 - acc: 0.9129\n",
      "Epoch 23/50\n",
      "551/551 [==============================] - 0s 32us/step - loss: 0.3804 - acc: 0.9165\n",
      "Epoch 24/50\n",
      "551/551 [==============================] - 0s 38us/step - loss: 0.3750 - acc: 0.9201\n",
      "Epoch 25/50\n",
      "551/551 [==============================] - 0s 31us/step - loss: 0.3698 - acc: 0.9256\n",
      "Epoch 26/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.3647 - acc: 0.9274\n",
      "Epoch 27/50\n",
      "551/551 [==============================] - 0s 32us/step - loss: 0.3596 - acc: 0.9292\n",
      "Epoch 28/50\n",
      "551/551 [==============================] - 0s 37us/step - loss: 0.3546 - acc: 0.9310\n",
      "Epoch 29/50\n",
      "551/551 [==============================] - 0s 34us/step - loss: 0.3496 - acc: 0.9347\n",
      "Epoch 30/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.3449 - acc: 0.9347\n",
      "Epoch 31/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.3401 - acc: 0.9310\n",
      "Epoch 32/50\n",
      "551/551 [==============================] - 0s 35us/step - loss: 0.3353 - acc: 0.9292\n",
      "Epoch 33/50\n",
      "551/551 [==============================] - 0s 27us/step - loss: 0.3306 - acc: 0.9292\n",
      "Epoch 34/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.3258 - acc: 0.9274\n",
      "Epoch 35/50\n",
      "551/551 [==============================] - 0s 31us/step - loss: 0.3212 - acc: 0.9292\n",
      "Epoch 36/50\n",
      "551/551 [==============================] - 0s 34us/step - loss: 0.3166 - acc: 0.9292\n",
      "Epoch 37/50\n",
      "551/551 [==============================] - 0s 26us/step - loss: 0.3121 - acc: 0.9310\n",
      "Epoch 38/50\n",
      "551/551 [==============================] - 0s 35us/step - loss: 0.3076 - acc: 0.9328\n",
      "Epoch 39/50\n",
      "551/551 [==============================] - 0s 29us/step - loss: 0.3033 - acc: 0.9347\n",
      "Epoch 40/50\n",
      "551/551 [==============================] - 0s 30us/step - loss: 0.2990 - acc: 0.9365\n",
      "Epoch 41/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.2948 - acc: 0.9347\n",
      "Epoch 42/50\n",
      "551/551 [==============================] - 0s 31us/step - loss: 0.2905 - acc: 0.9365\n",
      "Epoch 43/50\n",
      "551/551 [==============================] - 0s 34us/step - loss: 0.2864 - acc: 0.9365\n",
      "Epoch 44/50\n",
      "551/551 [==============================] - 0s 28us/step - loss: 0.2824 - acc: 0.9347\n",
      "Epoch 45/50\n",
      "551/551 [==============================] - 0s 30us/step - loss: 0.2784 - acc: 0.9328\n",
      "Epoch 46/50\n",
      "551/551 [==============================] - 0s 30us/step - loss: 0.2744 - acc: 0.9328\n",
      "Epoch 47/50\n",
      "551/551 [==============================] - 0s 30us/step - loss: 0.2705 - acc: 0.9347\n",
      "Epoch 48/50\n",
      "551/551 [==============================] - 0s 24us/step - loss: 0.2667 - acc: 0.9401\n",
      "Epoch 49/50\n",
      "551/551 [==============================] - 0s 26us/step - loss: 0.2630 - acc: 0.9419\n",
      "Epoch 50/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.2593 - acc: 0.9419\n",
      "137/137 [==============================] - 1s 5ms/step\n",
      "551/551 [==============================] - 0s 13us/step\n",
      "Epoch 1/50\n",
      "551/551 [==============================] - 2s 3ms/step - loss: 0.6835 - acc: 0.4646\n",
      "Epoch 2/50\n",
      "551/551 [==============================] - 0s 29us/step - loss: 0.6564 - acc: 0.5662\n",
      "Epoch 3/50\n",
      "551/551 [==============================] - 0s 30us/step - loss: 0.6308 - acc: 0.6116\n",
      "Epoch 4/50\n",
      "551/551 [==============================] - 0s 40us/step - loss: 0.6059 - acc: 0.6570\n",
      "Epoch 5/50\n",
      "551/551 [==============================] - 0s 32us/step - loss: 0.5821 - acc: 0.7151\n",
      "Epoch 6/50\n",
      "551/551 [==============================] - 0s 31us/step - loss: 0.5610 - acc: 0.7623\n",
      "Epoch 7/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.5422 - acc: 0.8040\n",
      "Epoch 8/50\n",
      "551/551 [==============================] - 0s 26us/step - loss: 0.5248 - acc: 0.8367\n",
      "Epoch 9/50\n",
      "551/551 [==============================] - 0s 34us/step - loss: 0.5091 - acc: 0.8693\n",
      "Epoch 10/50\n",
      "551/551 [==============================] - 0s 26us/step - loss: 0.4945 - acc: 0.8820\n",
      "Epoch 11/50\n",
      "551/551 [==============================] - 0s 35us/step - loss: 0.4815 - acc: 0.8966\n",
      "Epoch 12/50\n",
      "551/551 [==============================] - 0s 25us/step - loss: 0.4693 - acc: 0.9056\n",
      "Epoch 13/50\n",
      "551/551 [==============================] - 0s 37us/step - loss: 0.4581 - acc: 0.9074\n",
      "Epoch 14/50\n",
      "551/551 [==============================] - 0s 27us/step - loss: 0.4477 - acc: 0.9183\n",
      "Epoch 15/50\n",
      "551/551 [==============================] - 0s 29us/step - loss: 0.4377 - acc: 0.9220\n",
      "Epoch 16/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.4285 - acc: 0.9310\n",
      "Epoch 17/50\n",
      "551/551 [==============================] - 0s 30us/step - loss: 0.4199 - acc: 0.9347\n",
      "Epoch 18/50\n",
      "551/551 [==============================] - 0s 28us/step - loss: 0.4117 - acc: 0.9347\n",
      "Epoch 19/50\n",
      "551/551 [==============================] - 0s 30us/step - loss: 0.4041 - acc: 0.9328\n",
      "Epoch 20/50\n",
      "551/551 [==============================] - 0s 24us/step - loss: 0.3968 - acc: 0.9347\n",
      "Epoch 21/50\n",
      "551/551 [==============================] - 0s 30us/step - loss: 0.3897 - acc: 0.9328\n",
      "Epoch 22/50\n",
      "551/551 [==============================] - 0s 28us/step - loss: 0.3831 - acc: 0.9365\n",
      "Epoch 23/50\n",
      "551/551 [==============================] - 0s 25us/step - loss: 0.3765 - acc: 0.9401\n",
      "Epoch 24/50\n",
      "551/551 [==============================] - 0s 38us/step - loss: 0.3703 - acc: 0.9401\n",
      "Epoch 25/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.3642 - acc: 0.9401\n",
      "Epoch 26/50\n",
      "551/551 [==============================] - 0s 35us/step - loss: 0.3580 - acc: 0.9401\n",
      "Epoch 27/50\n",
      "551/551 [==============================] - 0s 34us/step - loss: 0.3524 - acc: 0.9383\n",
      "Epoch 28/50\n",
      "551/551 [==============================] - 0s 32us/step - loss: 0.3464 - acc: 0.9401\n",
      "Epoch 29/50\n",
      "551/551 [==============================] - 0s 51us/step - loss: 0.3407 - acc: 0.9401\n",
      "Epoch 30/50\n",
      "551/551 [==============================] - 0s 31us/step - loss: 0.3350 - acc: 0.9401\n",
      "Epoch 31/50\n",
      "551/551 [==============================] - 0s 34us/step - loss: 0.3294 - acc: 0.9419\n",
      "Epoch 32/50\n",
      "551/551 [==============================] - 0s 31us/step - loss: 0.3237 - acc: 0.9437\n",
      "Epoch 33/50\n",
      "551/551 [==============================] - 0s 30us/step - loss: 0.3181 - acc: 0.9456\n",
      "Epoch 34/50\n",
      "551/551 [==============================] - 0s 29us/step - loss: 0.3126 - acc: 0.9437\n",
      "Epoch 35/50\n",
      "551/551 [==============================] - 0s 29us/step - loss: 0.3071 - acc: 0.9419\n",
      "Epoch 36/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.3018 - acc: 0.9419\n",
      "Epoch 37/50\n",
      "551/551 [==============================] - 0s 29us/step - loss: 0.2965 - acc: 0.9456\n",
      "Epoch 38/50\n",
      "551/551 [==============================] - 0s 26us/step - loss: 0.2912 - acc: 0.9456\n",
      "Epoch 39/50\n",
      "551/551 [==============================] - 0s 35us/step - loss: 0.2859 - acc: 0.9456\n",
      "Epoch 40/50\n",
      "551/551 [==============================] - 0s 28us/step - loss: 0.2809 - acc: 0.9456\n",
      "Epoch 41/50\n",
      "551/551 [==============================] - 0s 30us/step - loss: 0.2759 - acc: 0.9456\n",
      "Epoch 42/50\n",
      "551/551 [==============================] - 0s 29us/step - loss: 0.2707 - acc: 0.9456\n",
      "Epoch 43/50\n",
      "551/551 [==============================] - 0s 27us/step - loss: 0.2660 - acc: 0.9456\n",
      "Epoch 44/50\n",
      "551/551 [==============================] - 0s 35us/step - loss: 0.2610 - acc: 0.9456\n",
      "Epoch 45/50\n",
      "551/551 [==============================] - 0s 29us/step - loss: 0.2564 - acc: 0.9456\n",
      "Epoch 46/50\n",
      "551/551 [==============================] - 0s 26us/step - loss: 0.2519 - acc: 0.9437\n",
      "Epoch 47/50\n",
      "551/551 [==============================] - 0s 30us/step - loss: 0.2475 - acc: 0.9437\n",
      "Epoch 48/50\n",
      "551/551 [==============================] - 0s 29us/step - loss: 0.2431 - acc: 0.9437\n",
      "Epoch 49/50\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "551/551 [==============================] - 0s 24us/step - loss: 0.2388 - acc: 0.9437\n",
      "Epoch 50/50\n",
      "551/551 [==============================] - 0s 30us/step - loss: 0.2346 - acc: 0.9437\n",
      "137/137 [==============================] - 1s 6ms/step\n",
      "551/551 [==============================] - 0s 12us/step\n",
      "Epoch 1/50\n",
      "550/550 [==============================] - 2s 4ms/step - loss: 0.6930 - acc: 0.5400\n",
      "Epoch 2/50\n",
      "550/550 [==============================] - 0s 37us/step - loss: 0.6925 - acc: 0.7818\n",
      "Epoch 3/50\n",
      "550/550 [==============================] - 0s 60us/step - loss: 0.6917 - acc: 0.9200\n",
      "Epoch 4/50\n",
      "550/550 [==============================] - 0s 46us/step - loss: 0.6905 - acc: 0.9327\n",
      "Epoch 5/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.6884 - acc: 0.9345\n",
      "Epoch 6/50\n",
      "550/550 [==============================] - 0s 39us/step - loss: 0.6852 - acc: 0.9309\n",
      "Epoch 7/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.6801 - acc: 0.9327\n",
      "Epoch 8/50\n",
      "550/550 [==============================] - 0s 36us/step - loss: 0.6721 - acc: 0.9309\n",
      "Epoch 9/50\n",
      "550/550 [==============================] - 0s 36us/step - loss: 0.6607 - acc: 0.9327\n",
      "Epoch 10/50\n",
      "550/550 [==============================] - 0s 40us/step - loss: 0.6444 - acc: 0.9345\n",
      "Epoch 11/50\n",
      "550/550 [==============================] - 0s 38us/step - loss: 0.6219 - acc: 0.9364\n",
      "Epoch 12/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.5938 - acc: 0.9345\n",
      "Epoch 13/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.5614 - acc: 0.9364\n",
      "Epoch 14/50\n",
      "550/550 [==============================] - 0s 43us/step - loss: 0.5269 - acc: 0.9327\n",
      "Epoch 15/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.4948 - acc: 0.9327\n",
      "Epoch 16/50\n",
      "550/550 [==============================] - 0s 38us/step - loss: 0.4665 - acc: 0.9345\n",
      "Epoch 17/50\n",
      "550/550 [==============================] - 0s 37us/step - loss: 0.4417 - acc: 0.9345\n",
      "Epoch 18/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.4210 - acc: 0.9364\n",
      "Epoch 19/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.4035 - acc: 0.9382\n",
      "Epoch 20/50\n",
      "550/550 [==============================] - 0s 40us/step - loss: 0.3882 - acc: 0.9400\n",
      "Epoch 21/50\n",
      "550/550 [==============================] - 0s 44us/step - loss: 0.3739 - acc: 0.9418\n",
      "Epoch 22/50\n",
      "550/550 [==============================] - 0s 52us/step - loss: 0.3607 - acc: 0.9418\n",
      "Epoch 23/50\n",
      "550/550 [==============================] - 0s 70us/step - loss: 0.3478 - acc: 0.9455\n",
      "Epoch 24/50\n",
      "550/550 [==============================] - 0s 52us/step - loss: 0.3351 - acc: 0.9436\n",
      "Epoch 25/50\n",
      "550/550 [==============================] - 0s 59us/step - loss: 0.3221 - acc: 0.9436\n",
      "Epoch 26/50\n",
      "550/550 [==============================] - 0s 40us/step - loss: 0.3094 - acc: 0.9455\n",
      "Epoch 27/50\n",
      "550/550 [==============================] - 0s 41us/step - loss: 0.2966 - acc: 0.9455\n",
      "Epoch 28/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.2830 - acc: 0.9455\n",
      "Epoch 29/50\n",
      "550/550 [==============================] - 0s 41us/step - loss: 0.2699 - acc: 0.9455\n",
      "Epoch 30/50\n",
      "550/550 [==============================] - 0s 37us/step - loss: 0.2567 - acc: 0.9473\n",
      "Epoch 31/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.2439 - acc: 0.9473\n",
      "Epoch 32/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.2312 - acc: 0.9473\n",
      "Epoch 33/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.2193 - acc: 0.9473\n",
      "Epoch 34/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.2082 - acc: 0.9491\n",
      "Epoch 35/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.1975 - acc: 0.9491\n",
      "Epoch 36/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.1874 - acc: 0.9491\n",
      "Epoch 37/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.1784 - acc: 0.9491\n",
      "Epoch 38/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.1702 - acc: 0.9491\n",
      "Epoch 39/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.1630 - acc: 0.9491\n",
      "Epoch 40/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.1565 - acc: 0.9509\n",
      "Epoch 41/50\n",
      "550/550 [==============================] - 0s 30us/step - loss: 0.1506 - acc: 0.9509\n",
      "Epoch 42/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.1453 - acc: 0.9527\n",
      "Epoch 43/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.1404 - acc: 0.9545\n",
      "Epoch 44/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.1364 - acc: 0.9564\n",
      "Epoch 45/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.1327 - acc: 0.9564\n",
      "Epoch 46/50\n",
      "550/550 [==============================] - 0s 47us/step - loss: 0.1288 - acc: 0.9582\n",
      "Epoch 47/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.1256 - acc: 0.9582\n",
      "Epoch 48/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.1227 - acc: 0.9564\n",
      "Epoch 49/50\n",
      "550/550 [==============================] - 0s 54us/step - loss: 0.1198 - acc: 0.9582\n",
      "Epoch 50/50\n",
      "550/550 [==============================] - 0s 56us/step - loss: 0.1176 - acc: 0.9564\n",
      "138/138 [==============================] - 1s 5ms/step\n",
      "550/550 [==============================] - 0s 14us/step\n",
      "Epoch 1/50\n",
      "550/550 [==============================] - 2s 3ms/step - loss: 0.6926 - acc: 0.7745\n",
      "Epoch 2/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.6919 - acc: 0.9073\n",
      "Epoch 3/50\n",
      "550/550 [==============================] - 0s 38us/step - loss: 0.6909 - acc: 0.9164\n",
      "Epoch 4/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.6893 - acc: 0.9091\n",
      "Epoch 5/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.6868 - acc: 0.9055\n",
      "Epoch 6/50\n",
      "550/550 [==============================] - 0s 30us/step - loss: 0.6830 - acc: 0.9091\n",
      "Epoch 7/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.6775 - acc: 0.9200\n",
      "Epoch 8/50\n",
      "550/550 [==============================] - 0s 30us/step - loss: 0.6695 - acc: 0.9218\n",
      "Epoch 9/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.6578 - acc: 0.9236\n",
      "Epoch 10/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.6411 - acc: 0.9218\n",
      "Epoch 11/50\n",
      "550/550 [==============================] - 0s 30us/step - loss: 0.6200 - acc: 0.9273\n",
      "Epoch 12/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.5936 - acc: 0.9364\n",
      "Epoch 13/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.5624 - acc: 0.9400\n",
      "Epoch 14/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.5310 - acc: 0.9382\n",
      "Epoch 15/50\n",
      "550/550 [==============================] - 0s 40us/step - loss: 0.4988 - acc: 0.9400\n",
      "Epoch 16/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.4704 - acc: 0.9400\n",
      "Epoch 17/50\n",
      "550/550 [==============================] - 0s 30us/step - loss: 0.4459 - acc: 0.9400\n",
      "Epoch 18/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.4248 - acc: 0.9418\n",
      "Epoch 19/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.4061 - acc: 0.9418\n",
      "Epoch 20/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.3896 - acc: 0.9418\n",
      "Epoch 21/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.3746 - acc: 0.9436\n",
      "Epoch 22/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.3608 - acc: 0.9436\n",
      "Epoch 23/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.3470 - acc: 0.9436\n",
      "Epoch 24/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.3336 - acc: 0.9418\n",
      "Epoch 25/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.3204 - acc: 0.9400\n",
      "Epoch 26/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.3072 - acc: 0.9400\n",
      "Epoch 27/50\n",
      "550/550 [==============================] - 0s 37us/step - loss: 0.2939 - acc: 0.9400\n",
      "Epoch 28/50\n",
      "550/550 [==============================] - 0s 30us/step - loss: 0.2804 - acc: 0.9400\n",
      "Epoch 29/50\n",
      "550/550 [==============================] - 0s 37us/step - loss: 0.2674 - acc: 0.9400\n",
      "Epoch 30/50\n",
      "550/550 [==============================] - 0s 30us/step - loss: 0.2546 - acc: 0.9436\n",
      "Epoch 31/50\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "550/550 [==============================] - 0s 28us/step - loss: 0.2419 - acc: 0.9436\n",
      "Epoch 32/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.2298 - acc: 0.9436\n",
      "Epoch 33/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.2184 - acc: 0.9436\n",
      "Epoch 34/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.2078 - acc: 0.9436\n",
      "Epoch 35/50\n",
      "550/550 [==============================] - 0s 38us/step - loss: 0.1977 - acc: 0.9436\n",
      "Epoch 36/50\n",
      "550/550 [==============================] - 0s 43us/step - loss: 0.1885 - acc: 0.9455\n",
      "Epoch 37/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.1799 - acc: 0.9455\n",
      "Epoch 38/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.1722 - acc: 0.9455\n",
      "Epoch 39/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.1653 - acc: 0.9473\n",
      "Epoch 40/50\n",
      "550/550 [==============================] - 0s 36us/step - loss: 0.1590 - acc: 0.9473\n",
      "Epoch 41/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.1531 - acc: 0.9473\n",
      "Epoch 42/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.1481 - acc: 0.9473\n",
      "Epoch 43/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.1433 - acc: 0.9473\n",
      "Epoch 44/50\n",
      "550/550 [==============================] - 0s 41us/step - loss: 0.1390 - acc: 0.9491\n",
      "Epoch 45/50\n",
      "550/550 [==============================] - 0s 36us/step - loss: 0.1352 - acc: 0.9509\n",
      "Epoch 46/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.1315 - acc: 0.9527\n",
      "Epoch 47/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.1283 - acc: 0.9527\n",
      "Epoch 48/50\n",
      "550/550 [==============================] - 0s 37us/step - loss: 0.1252 - acc: 0.9527\n",
      "Epoch 49/50\n",
      "550/550 [==============================] - 0s 37us/step - loss: 0.1223 - acc: 0.9545\n",
      "Epoch 50/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.1198 - acc: 0.9545\n",
      "138/138 [==============================] - 1s 5ms/step\n",
      "550/550 [==============================] - 0s 14us/step\n",
      "Epoch 1/50\n",
      "550/550 [==============================] - 2s 4ms/step - loss: 0.6932 - acc: 0.4273\n",
      "Epoch 2/50\n",
      "550/550 [==============================] - 0s 39us/step - loss: 0.6928 - acc: 0.5200\n",
      "Epoch 3/50\n",
      "550/550 [==============================] - 0s 42us/step - loss: 0.6920 - acc: 0.5200\n",
      "Epoch 4/50\n",
      "550/550 [==============================] - 0s 41us/step - loss: 0.6899 - acc: 0.5200\n",
      "Epoch 5/50\n",
      "550/550 [==============================] - 0s 42us/step - loss: 0.6867 - acc: 0.5200\n",
      "Epoch 6/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.6820 - acc: 0.5200\n",
      "Epoch 7/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.6749 - acc: 0.5200\n",
      "Epoch 8/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.6655 - acc: 0.5200\n",
      "Epoch 9/50\n",
      "550/550 [==============================] - 0s 38us/step - loss: 0.6521 - acc: 0.5200\n",
      "Epoch 10/50\n",
      "550/550 [==============================] - 0s 37us/step - loss: 0.6341 - acc: 0.5218\n",
      "Epoch 11/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.6117 - acc: 0.6236\n",
      "Epoch 12/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.5834 - acc: 0.7291\n",
      "Epoch 13/50\n",
      "550/550 [==============================] - 0s 41us/step - loss: 0.5542 - acc: 0.8073\n",
      "Epoch 14/50\n",
      "550/550 [==============================] - 0s 41us/step - loss: 0.5232 - acc: 0.8364\n",
      "Epoch 15/50\n",
      "550/550 [==============================] - 0s 37us/step - loss: 0.4946 - acc: 0.8655\n",
      "Epoch 16/50\n",
      "550/550 [==============================] - 0s 51us/step - loss: 0.4694 - acc: 0.8800\n",
      "Epoch 17/50\n",
      "550/550 [==============================] - 0s 40us/step - loss: 0.4479 - acc: 0.8945\n",
      "Epoch 18/50\n",
      "550/550 [==============================] - 0s 49us/step - loss: 0.4304 - acc: 0.8982\n",
      "Epoch 19/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.4161 - acc: 0.9018\n",
      "Epoch 20/50\n",
      "550/550 [==============================] - 0s 42us/step - loss: 0.4037 - acc: 0.9127\n",
      "Epoch 21/50\n",
      "550/550 [==============================] - 0s 36us/step - loss: 0.3929 - acc: 0.9164\n",
      "Epoch 22/50\n",
      "550/550 [==============================] - 0s 36us/step - loss: 0.3834 - acc: 0.9236\n",
      "Epoch 23/50\n",
      "550/550 [==============================] - 0s 36us/step - loss: 0.3748 - acc: 0.9255\n",
      "Epoch 24/50\n",
      "550/550 [==============================] - 0s 38us/step - loss: 0.3668 - acc: 0.9309\n",
      "Epoch 25/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.3590 - acc: 0.9291\n",
      "Epoch 26/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.3517 - acc: 0.9345\n",
      "Epoch 27/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.3444 - acc: 0.9400\n",
      "Epoch 28/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.3370 - acc: 0.9400\n",
      "Epoch 29/50\n",
      "550/550 [==============================] - 0s 38us/step - loss: 0.3295 - acc: 0.9382\n",
      "Epoch 30/50\n",
      "550/550 [==============================] - 0s 30us/step - loss: 0.3218 - acc: 0.9382\n",
      "Epoch 31/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.3137 - acc: 0.9400\n",
      "Epoch 32/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.3050 - acc: 0.9436\n",
      "Epoch 33/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.2963 - acc: 0.9436\n",
      "Epoch 34/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.2865 - acc: 0.9436\n",
      "Epoch 35/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.2768 - acc: 0.9436\n",
      "Epoch 36/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.2663 - acc: 0.9436\n",
      "Epoch 37/50\n",
      "550/550 [==============================] - 0s 36us/step - loss: 0.2561 - acc: 0.9418\n",
      "Epoch 38/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.2457 - acc: 0.9418\n",
      "Epoch 39/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.2351 - acc: 0.9418\n",
      "Epoch 40/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.2246 - acc: 0.9418\n",
      "Epoch 41/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.2147 - acc: 0.9436\n",
      "Epoch 42/50\n",
      "550/550 [==============================] - 0s 30us/step - loss: 0.2057 - acc: 0.9436\n",
      "Epoch 43/50\n",
      "550/550 [==============================] - 0s 30us/step - loss: 0.1962 - acc: 0.9436\n",
      "Epoch 44/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.1878 - acc: 0.9455\n",
      "Epoch 45/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.1805 - acc: 0.9455\n",
      "Epoch 46/50\n",
      "550/550 [==============================] - ETA: 0s - loss: 0.1682 - acc: 0.945 - 0s 37us/step - loss: 0.1735 - acc: 0.9455\n",
      "Epoch 47/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.1672 - acc: 0.9455\n",
      "Epoch 48/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.1617 - acc: 0.9436\n",
      "Epoch 49/50\n",
      "550/550 [==============================] - 0s 38us/step - loss: 0.1569 - acc: 0.9491\n",
      "Epoch 50/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.1526 - acc: 0.9491\n",
      "138/138 [==============================] - 1s 6ms/step\n",
      "550/550 [==============================] - 0s 20us/step\n",
      "Epoch 1/50\n",
      "551/551 [==============================] - 2s 4ms/step - loss: 0.6930 - acc: 0.7495\n",
      "Epoch 2/50\n",
      "551/551 [==============================] - 0s 30us/step - loss: 0.6924 - acc: 0.9238\n",
      "Epoch 3/50\n",
      "551/551 [==============================] - 0s 37us/step - loss: 0.6916 - acc: 0.9147\n",
      "Epoch 4/50\n",
      "551/551 [==============================] - 0s 35us/step - loss: 0.6904 - acc: 0.9165\n",
      "Epoch 5/50\n",
      "551/551 [==============================] - 0s 38us/step - loss: 0.6885 - acc: 0.9238\n",
      "Epoch 6/50\n",
      "551/551 [==============================] - 0s 30us/step - loss: 0.6856 - acc: 0.9183\n",
      "Epoch 7/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.6814 - acc: 0.9183\n",
      "Epoch 8/50\n",
      "551/551 [==============================] - 0s 32us/step - loss: 0.6753 - acc: 0.9183\n",
      "Epoch 9/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.6664 - acc: 0.9183\n",
      "Epoch 10/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.6549 - acc: 0.9165\n",
      "Epoch 11/50\n",
      "551/551 [==============================] - 0s 30us/step - loss: 0.6391 - acc: 0.9165\n",
      "Epoch 12/50\n",
      "551/551 [==============================] - 0s 34us/step - loss: 0.6198 - acc: 0.9220\n",
      "Epoch 13/50\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "551/551 [==============================] - 0s 37us/step - loss: 0.5954 - acc: 0.9256\n",
      "Epoch 14/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.5677 - acc: 0.9274\n",
      "Epoch 15/50\n",
      "551/551 [==============================] - 0s 34us/step - loss: 0.5375 - acc: 0.9274\n",
      "Epoch 16/50\n",
      "551/551 [==============================] - 0s 30us/step - loss: 0.5055 - acc: 0.9256\n",
      "Epoch 17/50\n",
      "551/551 [==============================] - 0s 39us/step - loss: 0.4743 - acc: 0.9292\n",
      "Epoch 18/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.4452 - acc: 0.9292\n",
      "Epoch 19/50\n",
      "551/551 [==============================] - 0s 31us/step - loss: 0.4175 - acc: 0.9328\n",
      "Epoch 20/50\n",
      "551/551 [==============================] - 0s 38us/step - loss: 0.3927 - acc: 0.9328\n",
      "Epoch 21/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.3696 - acc: 0.9328\n",
      "Epoch 22/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.3474 - acc: 0.9347\n",
      "Epoch 23/50\n",
      "551/551 [==============================] - 0s 38us/step - loss: 0.3259 - acc: 0.9347\n",
      "Epoch 24/50\n",
      "551/551 [==============================] - 0s 38us/step - loss: 0.3059 - acc: 0.9347\n",
      "Epoch 25/50\n",
      "551/551 [==============================] - 0s 37us/step - loss: 0.2864 - acc: 0.9347\n",
      "Epoch 26/50\n",
      "551/551 [==============================] - 0s 42us/step - loss: 0.2677 - acc: 0.9328\n",
      "Epoch 27/50\n",
      "551/551 [==============================] - 0s 38us/step - loss: 0.2501 - acc: 0.9347\n",
      "Epoch 28/50\n",
      "551/551 [==============================] - 0s 37us/step - loss: 0.2332 - acc: 0.9365\n",
      "Epoch 29/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.2188 - acc: 0.9365\n",
      "Epoch 30/50\n",
      "551/551 [==============================] - 0s 35us/step - loss: 0.2054 - acc: 0.9347\n",
      "Epoch 31/50\n",
      "551/551 [==============================] - 0s 31us/step - loss: 0.1936 - acc: 0.9347\n",
      "Epoch 32/50\n",
      "551/551 [==============================] - 0s 41us/step - loss: 0.1834 - acc: 0.9365\n",
      "Epoch 33/50\n",
      "551/551 [==============================] - 0s 37us/step - loss: 0.1743 - acc: 0.9383\n",
      "Epoch 34/50\n",
      "551/551 [==============================] - 0s 38us/step - loss: 0.1665 - acc: 0.9383\n",
      "Epoch 35/50\n",
      "551/551 [==============================] - 0s 38us/step - loss: 0.1597 - acc: 0.9383\n",
      "Epoch 36/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.1543 - acc: 0.9401\n",
      "Epoch 37/50\n",
      "551/551 [==============================] - 0s 31us/step - loss: 0.1490 - acc: 0.9419\n",
      "Epoch 38/50\n",
      "551/551 [==============================] - 0s 37us/step - loss: 0.1443 - acc: 0.9419\n",
      "Epoch 39/50\n",
      "551/551 [==============================] - 0s 39us/step - loss: 0.1402 - acc: 0.9419\n",
      "Epoch 40/50\n",
      "551/551 [==============================] - 0s 31us/step - loss: 0.1364 - acc: 0.9419\n",
      "Epoch 41/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.1332 - acc: 0.9419\n",
      "Epoch 42/50\n",
      "551/551 [==============================] - 0s 39us/step - loss: 0.1303 - acc: 0.9437\n",
      "Epoch 43/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.1274 - acc: 0.9492\n",
      "Epoch 44/50\n",
      "551/551 [==============================] - 0s 32us/step - loss: 0.1245 - acc: 0.9510\n",
      "Epoch 45/50\n",
      "551/551 [==============================] - 0s 37us/step - loss: 0.1222 - acc: 0.9510\n",
      "Epoch 46/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.1196 - acc: 0.9546\n",
      "Epoch 47/50\n",
      "551/551 [==============================] - 0s 32us/step - loss: 0.1173 - acc: 0.9546\n",
      "Epoch 48/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.1150 - acc: 0.9564\n",
      "Epoch 49/50\n",
      "551/551 [==============================] - 0s 27us/step - loss: 0.1130 - acc: 0.9583\n",
      "Epoch 50/50\n",
      "551/551 [==============================] - 0s 35us/step - loss: 0.1108 - acc: 0.9583\n",
      "137/137 [==============================] - 1s 6ms/step\n",
      "551/551 [==============================] - 0s 20us/step\n",
      "Epoch 1/50\n",
      "551/551 [==============================] - 3s 5ms/step - loss: 0.6931 - acc: 0.6080\n",
      "Epoch 2/50\n",
      "551/551 [==============================] - 0s 29us/step - loss: 0.6926 - acc: 0.6316\n",
      "Epoch 3/50\n",
      "551/551 [==============================] - 0s 34us/step - loss: 0.6918 - acc: 0.5953\n",
      "Epoch 4/50\n",
      "551/551 [==============================] - 0s 29us/step - loss: 0.6905 - acc: 0.7187\n",
      "Epoch 5/50\n",
      "551/551 [==============================] - 0s 31us/step - loss: 0.6884 - acc: 0.8966\n",
      "Epoch 6/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.6853 - acc: 0.9129\n",
      "Epoch 7/50\n",
      "551/551 [==============================] - 0s 39us/step - loss: 0.6805 - acc: 0.9256\n",
      "Epoch 8/50\n",
      "551/551 [==============================] - 0s 35us/step - loss: 0.6736 - acc: 0.9256\n",
      "Epoch 9/50\n",
      "551/551 [==============================] - 0s 37us/step - loss: 0.6638 - acc: 0.9256\n",
      "Epoch 10/50\n",
      "551/551 [==============================] - 0s 34us/step - loss: 0.6502 - acc: 0.9256\n",
      "Epoch 11/50\n",
      "551/551 [==============================] - 0s 38us/step - loss: 0.6332 - acc: 0.9292\n",
      "Epoch 12/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.6117 - acc: 0.9328\n",
      "Epoch 13/50\n",
      "551/551 [==============================] - 0s 31us/step - loss: 0.5854 - acc: 0.9365\n",
      "Epoch 14/50\n",
      "551/551 [==============================] - 0s 37us/step - loss: 0.5569 - acc: 0.9365\n",
      "Epoch 15/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.5264 - acc: 0.9365\n",
      "Epoch 16/50\n",
      "551/551 [==============================] - 0s 35us/step - loss: 0.4958 - acc: 0.9383\n",
      "Epoch 17/50\n",
      "551/551 [==============================] - 0s 34us/step - loss: 0.4669 - acc: 0.9383\n",
      "Epoch 18/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.4400 - acc: 0.9383\n",
      "Epoch 19/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.4153 - acc: 0.9383\n",
      "Epoch 20/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.3931 - acc: 0.9383\n",
      "Epoch 21/50\n",
      "551/551 [==============================] - 0s 29us/step - loss: 0.3719 - acc: 0.9401\n",
      "Epoch 22/50\n",
      "551/551 [==============================] - 0s 39us/step - loss: 0.3521 - acc: 0.9383\n",
      "Epoch 23/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.3329 - acc: 0.9383\n",
      "Epoch 24/50\n",
      "551/551 [==============================] - 0s 34us/step - loss: 0.3139 - acc: 0.9383\n",
      "Epoch 25/50\n",
      "551/551 [==============================] - 0s 32us/step - loss: 0.2954 - acc: 0.9401\n",
      "Epoch 26/50\n",
      "551/551 [==============================] - 0s 28us/step - loss: 0.2767 - acc: 0.9401\n",
      "Epoch 27/50\n",
      "551/551 [==============================] - 0s 35us/step - loss: 0.2591 - acc: 0.9401\n",
      "Epoch 28/50\n",
      "551/551 [==============================] - 0s 31us/step - loss: 0.2421 - acc: 0.9401\n",
      "Epoch 29/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.2257 - acc: 0.9401\n",
      "Epoch 30/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.2106 - acc: 0.9401\n",
      "Epoch 31/50\n",
      "551/551 [==============================] - 0s 26us/step - loss: 0.1978 - acc: 0.9401\n",
      "Epoch 32/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.1857 - acc: 0.9419\n",
      "Epoch 33/50\n",
      "551/551 [==============================] - 0s 29us/step - loss: 0.1753 - acc: 0.9419\n",
      "Epoch 34/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.1671 - acc: 0.9437\n",
      "Epoch 35/50\n",
      "551/551 [==============================] - 0s 30us/step - loss: 0.1593 - acc: 0.9437\n",
      "Epoch 36/50\n",
      "551/551 [==============================] - 0s 34us/step - loss: 0.1526 - acc: 0.9437\n",
      "Epoch 37/50\n",
      "551/551 [==============================] - 0s 32us/step - loss: 0.1464 - acc: 0.9456\n",
      "Epoch 38/50\n",
      "551/551 [==============================] - 0s 34us/step - loss: 0.1414 - acc: 0.9492\n",
      "Epoch 39/50\n",
      "551/551 [==============================] - 0s 32us/step - loss: 0.1371 - acc: 0.9492\n",
      "Epoch 40/50\n",
      "551/551 [==============================] - 0s 34us/step - loss: 0.1330 - acc: 0.9492\n",
      "Epoch 41/50\n",
      "551/551 [==============================] - 0s 35us/step - loss: 0.1295 - acc: 0.9492\n",
      "Epoch 42/50\n",
      "551/551 [==============================] - 0s 30us/step - loss: 0.1263 - acc: 0.9492\n",
      "Epoch 43/50\n",
      "551/551 [==============================] - 0s 35us/step - loss: 0.1234 - acc: 0.9528\n",
      "Epoch 44/50\n",
      "551/551 [==============================] - 0s 31us/step - loss: 0.1206 - acc: 0.9546\n",
      "Epoch 45/50\n",
      "551/551 [==============================] - 0s 37us/step - loss: 0.1182 - acc: 0.9564\n",
      "Epoch 46/50\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "551/551 [==============================] - 0s 32us/step - loss: 0.1159 - acc: 0.9564\n",
      "Epoch 47/50\n",
      "551/551 [==============================] - 0s 38us/step - loss: 0.1137 - acc: 0.9564\n",
      "Epoch 48/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.1115 - acc: 0.9564\n",
      "Epoch 49/50\n",
      "551/551 [==============================] - 0s 30us/step - loss: 0.1097 - acc: 0.9564\n",
      "Epoch 50/50\n",
      "551/551 [==============================] - 0s 35us/step - loss: 0.1078 - acc: 0.9583\n",
      "137/137 [==============================] - 1s 6ms/step\n",
      "551/551 [==============================] - 0s 16us/step\n",
      "Epoch 1/50\n",
      "550/550 [==============================] - 2s 4ms/step - loss: 0.6895 - acc: 0.6400\n",
      "Epoch 2/50\n",
      "550/550 [==============================] - 0s 43us/step - loss: 0.6746 - acc: 0.8382\n",
      "Epoch 3/50\n",
      "550/550 [==============================] - 0s 53us/step - loss: 0.6544 - acc: 0.8855\n",
      "Epoch 4/50\n",
      "550/550 [==============================] - 0s 41us/step - loss: 0.6293 - acc: 0.9164\n",
      "Epoch 5/50\n",
      "550/550 [==============================] - 0s 36us/step - loss: 0.5971 - acc: 0.9236\n",
      "Epoch 6/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.5614 - acc: 0.9309\n",
      "Epoch 7/50\n",
      "550/550 [==============================] - 0s 38us/step - loss: 0.5231 - acc: 0.9309\n",
      "Epoch 8/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.4840 - acc: 0.9345\n",
      "Epoch 9/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.4476 - acc: 0.9345\n",
      "Epoch 10/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.4131 - acc: 0.9436\n",
      "Epoch 11/50\n",
      "550/550 [==============================] - 0s 36us/step - loss: 0.3806 - acc: 0.9436\n",
      "Epoch 12/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.3499 - acc: 0.9455\n",
      "Epoch 13/50\n",
      "550/550 [==============================] - 0s 44us/step - loss: 0.3197 - acc: 0.9436\n",
      "Epoch 14/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.2899 - acc: 0.9455\n",
      "Epoch 15/50\n",
      "550/550 [==============================] - 0s 37us/step - loss: 0.2615 - acc: 0.9455\n",
      "Epoch 16/50\n",
      "550/550 [==============================] - 0s 37us/step - loss: 0.2357 - acc: 0.9473\n",
      "Epoch 17/50\n",
      "550/550 [==============================] - 0s 36us/step - loss: 0.2121 - acc: 0.9491\n",
      "Epoch 18/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.1908 - acc: 0.9509\n",
      "Epoch 19/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.1738 - acc: 0.9509\n",
      "Epoch 20/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.1596 - acc: 0.9509\n",
      "Epoch 21/50\n",
      "550/550 [==============================] - 0s 36us/step - loss: 0.1484 - acc: 0.9509\n",
      "Epoch 22/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.1393 - acc: 0.9545\n",
      "Epoch 23/50\n",
      "550/550 [==============================] - 0s 36us/step - loss: 0.1321 - acc: 0.9564\n",
      "Epoch 24/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.1257 - acc: 0.9582\n",
      "Epoch 25/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.1204 - acc: 0.9582\n",
      "Epoch 26/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.1159 - acc: 0.9600\n",
      "Epoch 27/50\n",
      "550/550 [==============================] - 0s 30us/step - loss: 0.1120 - acc: 0.9600\n",
      "Epoch 28/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.1086 - acc: 0.9582\n",
      "Epoch 29/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.1056 - acc: 0.9600\n",
      "Epoch 30/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.1027 - acc: 0.9618\n",
      "Epoch 31/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.0997 - acc: 0.9618\n",
      "Epoch 32/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.0975 - acc: 0.9618\n",
      "Epoch 33/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.0949 - acc: 0.9636\n",
      "Epoch 34/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.0927 - acc: 0.9655\n",
      "Epoch 35/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.0908 - acc: 0.9673\n",
      "Epoch 36/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.0885 - acc: 0.9709\n",
      "Epoch 37/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.0867 - acc: 0.9709\n",
      "Epoch 38/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.0843 - acc: 0.9709\n",
      "Epoch 39/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.0820 - acc: 0.9727\n",
      "Epoch 40/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.0806 - acc: 0.9709\n",
      "Epoch 41/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.0788 - acc: 0.9727\n",
      "Epoch 42/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.0769 - acc: 0.9709\n",
      "Epoch 43/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.0752 - acc: 0.9727\n",
      "Epoch 44/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.0737 - acc: 0.9745\n",
      "Epoch 45/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.0719 - acc: 0.9764\n",
      "Epoch 46/50\n",
      "550/550 [==============================] - 0s 30us/step - loss: 0.0701 - acc: 0.9764\n",
      "Epoch 47/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.0687 - acc: 0.9764\n",
      "Epoch 48/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.0670 - acc: 0.9764\n",
      "Epoch 49/50\n",
      "550/550 [==============================] - 0s 40us/step - loss: 0.0653 - acc: 0.9782\n",
      "Epoch 50/50\n",
      "550/550 [==============================] - 0s 36us/step - loss: 0.0638 - acc: 0.9800\n",
      "138/138 [==============================] - 1s 8ms/step\n",
      "550/550 [==============================] - 0s 22us/step\n",
      "Epoch 1/50\n",
      "550/550 [==============================] - 2s 4ms/step - loss: 0.6862 - acc: 0.5818\n",
      "Epoch 2/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.6547 - acc: 0.6800\n",
      "Epoch 3/50\n",
      "550/550 [==============================] - 0s 45us/step - loss: 0.6165 - acc: 0.7018\n",
      "Epoch 4/50\n",
      "550/550 [==============================] - 0s 36us/step - loss: 0.5742 - acc: 0.7582\n",
      "Epoch 5/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.5309 - acc: 0.8091\n",
      "Epoch 6/50\n",
      "550/550 [==============================] - 0s 30us/step - loss: 0.4925 - acc: 0.8618\n",
      "Epoch 7/50\n",
      "550/550 [==============================] - 0s 42us/step - loss: 0.4595 - acc: 0.8909\n",
      "Epoch 8/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.4322 - acc: 0.9073\n",
      "Epoch 9/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.4090 - acc: 0.9182\n",
      "Epoch 10/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.3880 - acc: 0.9345\n",
      "Epoch 11/50\n",
      "550/550 [==============================] - 0s 40us/step - loss: 0.3686 - acc: 0.9327\n",
      "Epoch 12/50\n",
      "550/550 [==============================] - 0s 27us/step - loss: 0.3491 - acc: 0.9382\n",
      "Epoch 13/50\n",
      "550/550 [==============================] - 0s 27us/step - loss: 0.3293 - acc: 0.9400\n",
      "Epoch 14/50\n",
      "550/550 [==============================] - 0s 36us/step - loss: 0.3091 - acc: 0.9418\n",
      "Epoch 15/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.2877 - acc: 0.9418\n",
      "Epoch 16/50\n",
      "550/550 [==============================] - 0s 36us/step - loss: 0.2665 - acc: 0.9455\n",
      "Epoch 17/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.2450 - acc: 0.9473\n",
      "Epoch 18/50\n",
      "550/550 [==============================] - 0s 30us/step - loss: 0.2244 - acc: 0.9455\n",
      "Epoch 19/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.2047 - acc: 0.9491\n",
      "Epoch 20/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.1869 - acc: 0.9491\n",
      "Epoch 21/50\n",
      "550/550 [==============================] - 0s 39us/step - loss: 0.1710 - acc: 0.9509\n",
      "Epoch 22/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.1575 - acc: 0.9509\n",
      "Epoch 23/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.1460 - acc: 0.9509\n",
      "Epoch 24/50\n",
      "550/550 [==============================] - 0s 37us/step - loss: 0.1362 - acc: 0.9509\n",
      "Epoch 25/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.1283 - acc: 0.9527\n",
      "Epoch 26/50\n",
      "550/550 [==============================] - 0s 27us/step - loss: 0.1215 - acc: 0.9582\n",
      "Epoch 27/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.1160 - acc: 0.9582\n",
      "Epoch 28/50\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "550/550 [==============================] - 0s 34us/step - loss: 0.1113 - acc: 0.9618\n",
      "Epoch 29/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.1071 - acc: 0.9618\n",
      "Epoch 30/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.1034 - acc: 0.9600\n",
      "Epoch 31/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.0999 - acc: 0.9600\n",
      "Epoch 32/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.0969 - acc: 0.9618\n",
      "Epoch 33/50\n",
      "550/550 [==============================] - 0s 30us/step - loss: 0.0941 - acc: 0.9636\n",
      "Epoch 34/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.0919 - acc: 0.9655\n",
      "Epoch 35/50\n",
      "550/550 [==============================] - 0s 43us/step - loss: 0.0893 - acc: 0.9636\n",
      "Epoch 36/50\n",
      "550/550 [==============================] - 0s 41us/step - loss: 0.0868 - acc: 0.9655\n",
      "Epoch 37/50\n",
      "550/550 [==============================] - 0s 48us/step - loss: 0.0850 - acc: 0.9673\n",
      "Epoch 38/50\n",
      "550/550 [==============================] - 0s 49us/step - loss: 0.0828 - acc: 0.9691\n",
      "Epoch 39/50\n",
      "550/550 [==============================] - 0s 43us/step - loss: 0.0810 - acc: 0.9709\n",
      "Epoch 40/50\n",
      "550/550 [==============================] - 0s 46us/step - loss: 0.0789 - acc: 0.9709\n",
      "Epoch 41/50\n",
      "550/550 [==============================] - 0s 41us/step - loss: 0.0770 - acc: 0.9709\n",
      "Epoch 42/50\n",
      "550/550 [==============================] - 0s 38us/step - loss: 0.0750 - acc: 0.9709\n",
      "Epoch 43/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.0734 - acc: 0.9709\n",
      "Epoch 44/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.0714 - acc: 0.9709\n",
      "Epoch 45/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.0698 - acc: 0.9727\n",
      "Epoch 46/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.0683 - acc: 0.9727\n",
      "Epoch 47/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.0666 - acc: 0.9745\n",
      "Epoch 48/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.0652 - acc: 0.9764\n",
      "Epoch 49/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.0637 - acc: 0.9764\n",
      "Epoch 50/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.0626 - acc: 0.9782\n",
      "138/138 [==============================] - 1s 6ms/step\n",
      "550/550 [==============================] - 0s 25us/step\n",
      "Epoch 1/50\n",
      "550/550 [==============================] - 2s 4ms/step - loss: 0.6827 - acc: 0.6364\n",
      "Epoch 2/50\n",
      "550/550 [==============================] - 0s 41us/step - loss: 0.6593 - acc: 0.5927\n",
      "Epoch 3/50\n",
      "550/550 [==============================] - 0s 46us/step - loss: 0.6316 - acc: 0.6309\n",
      "Epoch 4/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.5978 - acc: 0.7036\n",
      "Epoch 5/50\n",
      "550/550 [==============================] - 0s 40us/step - loss: 0.5594 - acc: 0.7618\n",
      "Epoch 6/50\n",
      "550/550 [==============================] - 0s 40us/step - loss: 0.5204 - acc: 0.8109\n",
      "Epoch 7/50\n",
      "550/550 [==============================] - 0s 38us/step - loss: 0.4832 - acc: 0.8382\n",
      "Epoch 8/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.4524 - acc: 0.8691\n",
      "Epoch 9/50\n",
      "550/550 [==============================] - 0s 42us/step - loss: 0.4268 - acc: 0.8909\n",
      "Epoch 10/50\n",
      "550/550 [==============================] - 0s 36us/step - loss: 0.4052 - acc: 0.9091\n",
      "Epoch 11/50\n",
      "550/550 [==============================] - 0s 44us/step - loss: 0.3862 - acc: 0.9145\n",
      "Epoch 12/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.3684 - acc: 0.9273\n",
      "Epoch 13/50\n",
      "550/550 [==============================] - 0s 41us/step - loss: 0.3511 - acc: 0.9309\n",
      "Epoch 14/50\n",
      "550/550 [==============================] - 0s 50us/step - loss: 0.3334 - acc: 0.9364\n",
      "Epoch 15/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.3155 - acc: 0.9400\n",
      "Epoch 16/50\n",
      "550/550 [==============================] - 0s 38us/step - loss: 0.2967 - acc: 0.9345\n",
      "Epoch 17/50\n",
      "550/550 [==============================] - 0s 45us/step - loss: 0.2773 - acc: 0.9345\n",
      "Epoch 18/50\n",
      "550/550 [==============================] - 0s 41us/step - loss: 0.2580 - acc: 0.9364\n",
      "Epoch 19/50\n",
      "550/550 [==============================] - 0s 42us/step - loss: 0.2394 - acc: 0.9382\n",
      "Epoch 20/50\n",
      "550/550 [==============================] - 0s 50us/step - loss: 0.2205 - acc: 0.9400\n",
      "Epoch 21/50\n",
      "550/550 [==============================] - 0s 44us/step - loss: 0.2041 - acc: 0.9418\n",
      "Epoch 22/50\n",
      "550/550 [==============================] - 0s 42us/step - loss: 0.1891 - acc: 0.9436\n",
      "Epoch 23/50\n",
      "550/550 [==============================] - 0s 42us/step - loss: 0.1764 - acc: 0.9418\n",
      "Epoch 24/50\n",
      "550/550 [==============================] - 0s 39us/step - loss: 0.1647 - acc: 0.9418\n",
      "Epoch 25/50\n",
      "550/550 [==============================] - 0s 41us/step - loss: 0.1551 - acc: 0.9436\n",
      "Epoch 26/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.1470 - acc: 0.9473\n",
      "Epoch 27/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.1401 - acc: 0.9473\n",
      "Epoch 28/50\n",
      "550/550 [==============================] - 0s 36us/step - loss: 0.1341 - acc: 0.9491\n",
      "Epoch 29/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.1287 - acc: 0.9491\n",
      "Epoch 30/50\n",
      "550/550 [==============================] - 0s 33us/step - loss: 0.1241 - acc: 0.9509\n",
      "Epoch 31/50\n",
      "550/550 [==============================] - 0s 36us/step - loss: 0.1205 - acc: 0.9509\n",
      "Epoch 32/50\n",
      "550/550 [==============================] - 0s 30us/step - loss: 0.1171 - acc: 0.9545\n",
      "Epoch 33/50\n",
      "550/550 [==============================] - 0s 35us/step - loss: 0.1142 - acc: 0.9545\n",
      "Epoch 34/50\n",
      "550/550 [==============================] - 0s 34us/step - loss: 0.1112 - acc: 0.9564\n",
      "Epoch 35/50\n",
      "550/550 [==============================] - 0s 30us/step - loss: 0.1085 - acc: 0.9564\n",
      "Epoch 36/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.1059 - acc: 0.9564\n",
      "Epoch 37/50\n",
      "550/550 [==============================] - 0s 37us/step - loss: 0.1035 - acc: 0.9600\n",
      "Epoch 38/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.1008 - acc: 0.9618\n",
      "Epoch 39/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.0987 - acc: 0.9636\n",
      "Epoch 40/50\n",
      "550/550 [==============================] - 0s 28us/step - loss: 0.0966 - acc: 0.9618\n",
      "Epoch 41/50\n",
      "550/550 [==============================] - 0s 40us/step - loss: 0.0949 - acc: 0.9636\n",
      "Epoch 42/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.0926 - acc: 0.9655\n",
      "Epoch 43/50\n",
      "550/550 [==============================] - 0s 27us/step - loss: 0.0909 - acc: 0.9636\n",
      "Epoch 44/50\n",
      "550/550 [==============================] - 0s 31us/step - loss: 0.0890 - acc: 0.9655\n",
      "Epoch 45/50\n",
      "550/550 [==============================] - 0s 42us/step - loss: 0.0875 - acc: 0.9636\n",
      "Epoch 46/50\n",
      "550/550 [==============================] - 0s 29us/step - loss: 0.0858 - acc: 0.9655\n",
      "Epoch 47/50\n",
      "550/550 [==============================] - 0s 27us/step - loss: 0.0840 - acc: 0.9673\n",
      "Epoch 48/50\n",
      "550/550 [==============================] - 0s 37us/step - loss: 0.0824 - acc: 0.9673\n",
      "Epoch 49/50\n",
      "550/550 [==============================] - 0s 32us/step - loss: 0.0808 - acc: 0.9709\n",
      "Epoch 50/50\n",
      "550/550 [==============================] - 0s 30us/step - loss: 0.0796 - acc: 0.9727\n",
      "138/138 [==============================] - 1s 7ms/step\n",
      "550/550 [==============================] - 0s 19us/step\n",
      "Epoch 1/50\n",
      "551/551 [==============================] - 2s 4ms/step - loss: 0.6955 - acc: 0.6298\n",
      "Epoch 2/50\n",
      "551/551 [==============================] - 0s 30us/step - loss: 0.6729 - acc: 0.9111\n",
      "Epoch 3/50\n",
      "551/551 [==============================] - 0s 45us/step - loss: 0.6466 - acc: 0.8966\n",
      "Epoch 4/50\n",
      "551/551 [==============================] - 0s 38us/step - loss: 0.6154 - acc: 0.8947\n",
      "Epoch 5/50\n",
      "551/551 [==============================] - 0s 44us/step - loss: 0.5775 - acc: 0.8984\n",
      "Epoch 6/50\n",
      "551/551 [==============================] - 0s 32us/step - loss: 0.5376 - acc: 0.9056\n",
      "Epoch 7/50\n",
      "551/551 [==============================] - 0s 31us/step - loss: 0.4989 - acc: 0.9165\n",
      "Epoch 8/50\n",
      "551/551 [==============================] - 0s 39us/step - loss: 0.4616 - acc: 0.9274\n",
      "Epoch 9/50\n",
      "551/551 [==============================] - 0s 38us/step - loss: 0.4300 - acc: 0.9347\n",
      "Epoch 10/50\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "551/551 [==============================] - 0s 39us/step - loss: 0.4010 - acc: 0.9347\n",
      "Epoch 11/50\n",
      "551/551 [==============================] - 0s 34us/step - loss: 0.3751 - acc: 0.9365\n",
      "Epoch 12/50\n",
      "551/551 [==============================] - 0s 29us/step - loss: 0.3505 - acc: 0.9347\n",
      "Epoch 13/50\n",
      "551/551 [==============================] - 0s 37us/step - loss: 0.3263 - acc: 0.9365\n",
      "Epoch 14/50\n",
      "551/551 [==============================] - 0s 35us/step - loss: 0.3023 - acc: 0.9365\n",
      "Epoch 15/50\n",
      "551/551 [==============================] - 0s 31us/step - loss: 0.2792 - acc: 0.9401\n",
      "Epoch 16/50\n",
      "551/551 [==============================] - 0s 47us/step - loss: 0.2551 - acc: 0.9383\n",
      "Epoch 17/50\n",
      "551/551 [==============================] - 0s 41us/step - loss: 0.2339 - acc: 0.9365\n",
      "Epoch 18/50\n",
      "551/551 [==============================] - 0s 35us/step - loss: 0.2128 - acc: 0.9383\n",
      "Epoch 19/50\n",
      "551/551 [==============================] - 0s 35us/step - loss: 0.1946 - acc: 0.9365\n",
      "Epoch 20/50\n",
      "551/551 [==============================] - 0s 37us/step - loss: 0.1782 - acc: 0.9401\n",
      "Epoch 21/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.1645 - acc: 0.9437\n",
      "Epoch 22/50\n",
      "551/551 [==============================] - 0s 39us/step - loss: 0.1530 - acc: 0.9474\n",
      "Epoch 23/50\n",
      "551/551 [==============================] - 0s 37us/step - loss: 0.1433 - acc: 0.9456\n",
      "Epoch 24/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.1352 - acc: 0.9456\n",
      "Epoch 25/50\n",
      "551/551 [==============================] - 0s 31us/step - loss: 0.1285 - acc: 0.9474\n",
      "Epoch 26/50\n",
      "551/551 [==============================] - 0s 35us/step - loss: 0.1228 - acc: 0.9528\n",
      "Epoch 27/50\n",
      "551/551 [==============================] - 0s 35us/step - loss: 0.1178 - acc: 0.9546\n",
      "Epoch 28/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.1135 - acc: 0.9528\n",
      "Epoch 29/50\n",
      "551/551 [==============================] - 0s 34us/step - loss: 0.1096 - acc: 0.9528\n",
      "Epoch 30/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.1062 - acc: 0.9546\n",
      "Epoch 31/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.1029 - acc: 0.9601\n",
      "Epoch 32/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.1002 - acc: 0.9619\n",
      "Epoch 33/50\n",
      "551/551 [==============================] - 0s 34us/step - loss: 0.0973 - acc: 0.9637\n",
      "Epoch 34/50\n",
      "551/551 [==============================] - 0s 40us/step - loss: 0.0948 - acc: 0.9637\n",
      "Epoch 35/50\n",
      "551/551 [==============================] - 0s 49us/step - loss: 0.0926 - acc: 0.9637\n",
      "Epoch 36/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.0903 - acc: 0.9655\n",
      "Epoch 37/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.0881 - acc: 0.9673\n",
      "Epoch 38/50\n",
      "551/551 [==============================] - 0s 34us/step - loss: 0.0861 - acc: 0.9673\n",
      "Epoch 39/50\n",
      "551/551 [==============================] - 0s 35us/step - loss: 0.0841 - acc: 0.9673\n",
      "Epoch 40/50\n",
      "551/551 [==============================] - 0s 32us/step - loss: 0.0822 - acc: 0.9673\n",
      "Epoch 41/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.0804 - acc: 0.9691\n",
      "Epoch 42/50\n",
      "551/551 [==============================] - 0s 34us/step - loss: 0.0786 - acc: 0.9710\n",
      "Epoch 43/50\n",
      "551/551 [==============================] - 0s 35us/step - loss: 0.0767 - acc: 0.9728\n",
      "Epoch 44/50\n",
      "551/551 [==============================] - 0s 35us/step - loss: 0.0749 - acc: 0.9728\n",
      "Epoch 45/50\n",
      "551/551 [==============================] - 0s 34us/step - loss: 0.0736 - acc: 0.9728\n",
      "Epoch 46/50\n",
      "551/551 [==============================] - 0s 29us/step - loss: 0.0719 - acc: 0.9728\n",
      "Epoch 47/50\n",
      "551/551 [==============================] - 0s 37us/step - loss: 0.0701 - acc: 0.9728\n",
      "Epoch 48/50\n",
      "551/551 [==============================] - 0s 32us/step - loss: 0.0687 - acc: 0.9728\n",
      "Epoch 49/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.0671 - acc: 0.9728\n",
      "Epoch 50/50\n",
      "551/551 [==============================] - 0s 34us/step - loss: 0.0659 - acc: 0.9728\n",
      "137/137 [==============================] - 1s 6ms/step\n",
      "551/551 [==============================] - 0s 16us/step\n",
      "Epoch 1/50\n",
      "551/551 [==============================] - 2s 4ms/step - loss: 0.6949 - acc: 0.5191\n",
      "Epoch 2/50\n",
      "551/551 [==============================] - 0s 41us/step - loss: 0.6783 - acc: 0.7441\n",
      "Epoch 3/50\n",
      "551/551 [==============================] - 0s 44us/step - loss: 0.6599 - acc: 0.7477\n",
      "Epoch 4/50\n",
      "551/551 [==============================] - 0s 45us/step - loss: 0.6312 - acc: 0.8131\n",
      "Epoch 5/50\n",
      "551/551 [==============================] - 0s 44us/step - loss: 0.5958 - acc: 0.8820\n",
      "Epoch 6/50\n",
      "551/551 [==============================] - 0s 57us/step - loss: 0.5546 - acc: 0.8947\n",
      "Epoch 7/50\n",
      "551/551 [==============================] - 0s 49us/step - loss: 0.5099 - acc: 0.9183\n",
      "Epoch 8/50\n",
      "551/551 [==============================] - 0s 64us/step - loss: 0.4687 - acc: 0.9274\n",
      "Epoch 9/50\n",
      "551/551 [==============================] - 0s 75us/step - loss: 0.4333 - acc: 0.9383\n",
      "Epoch 10/50\n",
      "551/551 [==============================] - 0s 52us/step - loss: 0.4033 - acc: 0.9401\n",
      "Epoch 11/50\n",
      "551/551 [==============================] - 0s 64us/step - loss: 0.3769 - acc: 0.9401\n",
      "Epoch 12/50\n",
      "551/551 [==============================] - 0s 59us/step - loss: 0.3534 - acc: 0.9419\n",
      "Epoch 13/50\n",
      "551/551 [==============================] - 0s 51us/step - loss: 0.3304 - acc: 0.9437\n",
      "Epoch 14/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.3076 - acc: 0.9401\n",
      "Epoch 15/50\n",
      "551/551 [==============================] - 0s 42us/step - loss: 0.2842 - acc: 0.9419\n",
      "Epoch 16/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.2613 - acc: 0.9437\n",
      "Epoch 17/50\n",
      "551/551 [==============================] - 0s 31us/step - loss: 0.2385 - acc: 0.9437\n",
      "Epoch 18/50\n",
      "551/551 [==============================] - 0s 44us/step - loss: 0.2176 - acc: 0.9437\n",
      "Epoch 19/50\n",
      "551/551 [==============================] - 0s 30us/step - loss: 0.1977 - acc: 0.9437\n",
      "Epoch 20/50\n",
      "551/551 [==============================] - 0s 31us/step - loss: 0.1810 - acc: 0.9437\n",
      "Epoch 21/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.1666 - acc: 0.9474\n",
      "Epoch 22/50\n",
      "551/551 [==============================] - 0s 31us/step - loss: 0.1545 - acc: 0.9474\n",
      "Epoch 23/50\n",
      "551/551 [==============================] - 0s 30us/step - loss: 0.1447 - acc: 0.9492\n",
      "Epoch 24/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.1362 - acc: 0.9492\n",
      "Epoch 25/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.1299 - acc: 0.9528\n",
      "Epoch 26/50\n",
      "551/551 [==============================] - 0s 28us/step - loss: 0.1243 - acc: 0.9546\n",
      "Epoch 27/50\n",
      "551/551 [==============================] - 0s 37us/step - loss: 0.1196 - acc: 0.9546\n",
      "Epoch 28/50\n",
      "551/551 [==============================] - 0s 35us/step - loss: 0.1155 - acc: 0.9564\n",
      "Epoch 29/50\n",
      "551/551 [==============================] - 0s 39us/step - loss: 0.1121 - acc: 0.9564\n",
      "Epoch 30/50\n",
      "551/551 [==============================] - 0s 33us/step - loss: 0.1087 - acc: 0.9564\n",
      "Epoch 31/50\n",
      "551/551 [==============================] - 0s 34us/step - loss: 0.1056 - acc: 0.9564\n",
      "Epoch 32/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.1029 - acc: 0.9583\n",
      "Epoch 33/50\n",
      "551/551 [==============================] - 0s 30us/step - loss: 0.1007 - acc: 0.9601\n",
      "Epoch 34/50\n",
      "551/551 [==============================] - 0s 46us/step - loss: 0.0982 - acc: 0.9601\n",
      "Epoch 35/50\n",
      "551/551 [==============================] - 0s 34us/step - loss: 0.0958 - acc: 0.9601\n",
      "Epoch 36/50\n",
      "551/551 [==============================] - 0s 37us/step - loss: 0.0940 - acc: 0.9619\n",
      "Epoch 37/50\n",
      "551/551 [==============================] - 0s 45us/step - loss: 0.0918 - acc: 0.9619\n",
      "Epoch 38/50\n",
      "551/551 [==============================] - 0s 34us/step - loss: 0.0899 - acc: 0.9619\n",
      "Epoch 39/50\n",
      "551/551 [==============================] - 0s 32us/step - loss: 0.0881 - acc: 0.9619\n",
      "Epoch 40/50\n",
      "551/551 [==============================] - 0s 41us/step - loss: 0.0864 - acc: 0.9619\n",
      "Epoch 41/50\n",
      "551/551 [==============================] - 0s 29us/step - loss: 0.0844 - acc: 0.9619\n",
      "Epoch 42/50\n",
      "551/551 [==============================] - 0s 29us/step - loss: 0.0828 - acc: 0.9619\n",
      "Epoch 43/50\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "551/551 [==============================] - 0s 41us/step - loss: 0.0811 - acc: 0.9637\n",
      "Epoch 44/50\n",
      "551/551 [==============================] - 0s 34us/step - loss: 0.0794 - acc: 0.9637\n",
      "Epoch 45/50\n",
      "551/551 [==============================] - 0s 32us/step - loss: 0.0780 - acc: 0.9637\n",
      "Epoch 46/50\n",
      "551/551 [==============================] - 0s 36us/step - loss: 0.0768 - acc: 0.9673\n",
      "Epoch 47/50\n",
      "551/551 [==============================] - 0s 45us/step - loss: 0.0751 - acc: 0.9655\n",
      "Epoch 48/50\n",
      "551/551 [==============================] - 0s 46us/step - loss: 0.0737 - acc: 0.9673\n",
      "Epoch 49/50\n",
      "551/551 [==============================] - 0s 35us/step - loss: 0.0722 - acc: 0.9710\n",
      "Epoch 50/50\n",
      "551/551 [==============================] - 0s 62us/step - loss: 0.0708 - acc: 0.9728\n",
      "137/137 [==============================] - 1s 8ms/step\n",
      "551/551 [==============================] - 0s 21us/step\n",
      "Epoch 1/50\n",
      "688/688 [==============================] - 3s 4ms/step - loss: 0.6889 - acc: 0.6366\n",
      "Epoch 2/50\n",
      "688/688 [==============================] - 0s 43us/step - loss: 0.6574 - acc: 0.7442\n",
      "Epoch 3/50\n",
      "688/688 [==============================] - 0s 40us/step - loss: 0.6325 - acc: 0.7863\n",
      "Epoch 4/50\n",
      "688/688 [==============================] - 0s 36us/step - loss: 0.5996 - acc: 0.8503\n",
      "Epoch 5/50\n",
      "688/688 [==============================] - 0s 37us/step - loss: 0.5579 - acc: 0.8852\n",
      "Epoch 6/50\n",
      "688/688 [==============================] - 0s 33us/step - loss: 0.5113 - acc: 0.9157\n",
      "Epoch 7/50\n",
      "688/688 [==============================] - 0s 44us/step - loss: 0.4680 - acc: 0.9302\n",
      "Epoch 8/50\n",
      "688/688 [==============================] - 0s 40us/step - loss: 0.4292 - acc: 0.9346\n",
      "Epoch 9/50\n",
      "688/688 [==============================] - 0s 35us/step - loss: 0.3955 - acc: 0.9360\n",
      "Epoch 10/50\n",
      "688/688 [==============================] - 0s 38us/step - loss: 0.3656 - acc: 0.9346\n",
      "Epoch 11/50\n",
      "688/688 [==============================] - 0s 35us/step - loss: 0.3371 - acc: 0.9375\n",
      "Epoch 12/50\n",
      "688/688 [==============================] - 0s 40us/step - loss: 0.3089 - acc: 0.9404\n",
      "Epoch 13/50\n",
      "688/688 [==============================] - 0s 37us/step - loss: 0.2804 - acc: 0.9390\n",
      "Epoch 14/50\n",
      "688/688 [==============================] - 0s 36us/step - loss: 0.2530 - acc: 0.9390\n",
      "Epoch 15/50\n",
      "688/688 [==============================] - 0s 36us/step - loss: 0.2273 - acc: 0.9404\n",
      "Epoch 16/50\n",
      "688/688 [==============================] - 0s 48us/step - loss: 0.2042 - acc: 0.9404\n",
      "Epoch 17/50\n",
      "688/688 [==============================] - 0s 51us/step - loss: 0.1847 - acc: 0.9433\n",
      "Epoch 18/50\n",
      "688/688 [==============================] - 0s 57us/step - loss: 0.1682 - acc: 0.9433\n",
      "Epoch 19/50\n",
      "688/688 [==============================] - 0s 46us/step - loss: 0.1555 - acc: 0.9462\n",
      "Epoch 20/50\n",
      "688/688 [==============================] - 0s 54us/step - loss: 0.1451 - acc: 0.9462\n",
      "Epoch 21/50\n",
      "688/688 [==============================] - 0s 55us/step - loss: 0.1371 - acc: 0.9491\n",
      "Epoch 22/50\n",
      "688/688 [==============================] - 0s 50us/step - loss: 0.1308 - acc: 0.9506\n",
      "Epoch 23/50\n",
      "688/688 [==============================] - 0s 230us/step - loss: 0.1252 - acc: 0.9491\n",
      "Epoch 24/50\n",
      "688/688 [==============================] - 0s 37us/step - loss: 0.1209 - acc: 0.9520\n",
      "Epoch 25/50\n",
      "688/688 [==============================] - 0s 35us/step - loss: 0.1170 - acc: 0.9520\n",
      "Epoch 26/50\n",
      "688/688 [==============================] - 0s 37us/step - loss: 0.1135 - acc: 0.9535\n",
      "Epoch 27/50\n",
      "688/688 [==============================] - 0s 35us/step - loss: 0.1097 - acc: 0.9549\n",
      "Epoch 28/50\n",
      "688/688 [==============================] - 0s 43us/step - loss: 0.1071 - acc: 0.9549\n",
      "Epoch 29/50\n",
      "688/688 [==============================] - 0s 37us/step - loss: 0.1042 - acc: 0.9593\n",
      "Epoch 30/50\n",
      "688/688 [==============================] - 0s 52us/step - loss: 0.1016 - acc: 0.9608\n",
      "Epoch 31/50\n",
      "688/688 [==============================] - 0s 40us/step - loss: 0.0993 - acc: 0.9637\n",
      "Epoch 32/50\n",
      "688/688 [==============================] - 0s 62us/step - loss: 0.0971 - acc: 0.9637\n",
      "Epoch 33/50\n",
      "688/688 [==============================] - 0s 39us/step - loss: 0.0944 - acc: 0.9637\n",
      "Epoch 34/50\n",
      "688/688 [==============================] - 0s 35us/step - loss: 0.0924 - acc: 0.9637\n",
      "Epoch 35/50\n",
      "688/688 [==============================] - 0s 44us/step - loss: 0.0904 - acc: 0.9637\n",
      "Epoch 36/50\n",
      "688/688 [==============================] - 0s 39us/step - loss: 0.0884 - acc: 0.9637\n",
      "Epoch 37/50\n",
      "688/688 [==============================] - 0s 33us/step - loss: 0.0866 - acc: 0.9651\n",
      "Epoch 38/50\n",
      "688/688 [==============================] - 0s 32us/step - loss: 0.0846 - acc: 0.9651\n",
      "Epoch 39/50\n",
      "688/688 [==============================] - 0s 32us/step - loss: 0.0830 - acc: 0.9666\n",
      "Epoch 40/50\n",
      "688/688 [==============================] - 0s 33us/step - loss: 0.0814 - acc: 0.9666\n",
      "Epoch 41/50\n",
      "688/688 [==============================] - 0s 30us/step - loss: 0.0794 - acc: 0.9695\n",
      "Epoch 42/50\n",
      "688/688 [==============================] - 0s 28us/step - loss: 0.0781 - acc: 0.9709\n",
      "Epoch 43/50\n",
      "688/688 [==============================] - 0s 39us/step - loss: 0.0766 - acc: 0.9724\n",
      "Epoch 44/50\n",
      "688/688 [==============================] - 0s 39us/step - loss: 0.0751 - acc: 0.9680\n",
      "Epoch 45/50\n",
      "688/688 [==============================] - 0s 35us/step - loss: 0.0732 - acc: 0.9695\n",
      "Epoch 46/50\n",
      "688/688 [==============================] - 0s 39us/step - loss: 0.0718 - acc: 0.9738\n",
      "Epoch 47/50\n",
      "688/688 [==============================] - 0s 42us/step - loss: 0.0703 - acc: 0.9738\n",
      "Epoch 48/50\n",
      "688/688 [==============================] - 0s 42us/step - loss: 0.0687 - acc: 0.9738\n",
      "Epoch 49/50\n",
      "688/688 [==============================] - 0s 37us/step - loss: 0.0674 - acc: 0.9767\n",
      "Epoch 50/50\n",
      "688/688 [==============================] - 0s 41us/step - loss: 0.0657 - acc: 0.9782\n",
      "Best parameters set found on development set:\n",
      "\n",
      "{'hidden_dimensions': [100, 10]}\n",
      "Grid scores on development set:\n",
      "0.903 (+/-0.066) for {'hidden_dimensions': [10]}\n",
      "0.897 (+/-0.070) for {'hidden_dimensions': [10, 10, 10]}\n",
      "0.912 (+/-0.079) for {'hidden_dimensions': [100, 10]}\n"
     ]
    }
   ],
   "source": [
    "print_gridsearch_scores_deep_learning(X_train_undersample, y_train_undersample)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-04T00:54:14.234398Z",
     "start_time": "2018-11-04T00:54:09.498606Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('Recall metric in the testing dataset: ', 0.9183673469387755)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Use this hidden_dimensions paraemeter to build the final model with the whole training dataset and \n",
    "# predict the classes in the test dataset\n",
    "k = KerasClassifier(build_fn=network_builder, epochs=50, batch_size=128, \n",
    "                     hidden_dimensions=[100, 10], verbose=0, input_dim=29)\n",
    "k.fit(X_train_undersample,y_train_undersample.values.ravel())\n",
    "y_pred_undersample = k.predict(X_test_undersample.values)\n",
    "\n",
    "# Compute confusion matrix\n",
    "cnf_matrix = confusion_matrix(y_test_undersample,y_pred_undersample)\n",
    "np.set_printoptions(precision=2)\n",
    "\n",
    "print(\"Recall metric in the testing dataset: \", cnf_matrix[1,1]/(cnf_matrix[1,0]+cnf_matrix[1,1]))\n",
    "\n",
    "# Plot non-normalized confusion matrix\n",
    "class_names = [0,1]\n",
    "plt.figure()\n",
    "plot_confusion_matrix(cnf_matrix\n",
    "                      , classes=class_names\n",
    "                      , title='Confusion matrix')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-04T00:57:52.103697Z",
     "start_time": "2018-11-04T00:57:50.892057Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('Recall metric in the testing dataset: ', 0.9455782312925171)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "y_pred = k.predict(X_test.values)\n",
    "\n",
    "# Compute confusion matrix\n",
    "cnf_matrix = confusion_matrix(y_test,y_pred)\n",
    "np.set_printoptions(precision=2)\n",
    "\n",
    "print(\"Recall metric in the testing dataset: \", cnf_matrix[1,1]/(cnf_matrix[1,0]+cnf_matrix[1,1]))\n",
    "\n",
    "# Plot non-normalized confusion matrix\n",
    "class_names = [0,1]\n",
    "plt.figure()\n",
    "plot_confusion_matrix(cnf_matrix\n",
    "                      , classes=class_names\n",
    "                      , title='Confusion matrix')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# this is the best recall so far that we've seen on the entire dataset, thanks to deep learning"
   ]
  }
 ],
 "metadata": {
  "_change_revision": 4,
  "_is_fork": false,
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
